我必須撰寫一個簡單的 pi 近似值,我做到了,它作業正常,但是在任務中它說要撰寫一個帶有標題“pi_approx :: Int -> Double”的函式。
我的代碼:
pi_approx x = sqrt (pi2_approx(x))
pi2_approx x =
if x/= 1
then (6 /(x*x)) (pi2_approx(x-1))
else (6/(1*1))
然而,我的函式在沒有“pi_approx :: Int -> Double”的情況下作業正常,但是當我嘗試使用這個宣告時,我總是得到型別錯誤:
pi_approx.hs:10:14: 錯誤:
- 無法匹配預期型別
Double' with actual typeInt' - 在運算式中: ( ) (6 / (x * x)) (pi2_approx (x - 1)) 在運算式中: if x /= 1 then ( ) (6 / (x * x)) (pi2_approx (x - 1)) else (6 / (1 * 1)) 在 `pi2_approx' 的等式中: pi2_approx x = if x /= 1 then ( ) (6 / (x * x)) (pi2_approx (x - 1) ) 否則 (6 / (1 * 1)) | 10 | 然后 ( ) (6 /(x*x)) (pi2_approx(x-1)) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
我嘗試以各種方式使用 fromIntegral,如果我在沒有宣告的情況下運行該函式,我檢查了解決方案的型別,即:“(Floating a, Eq a) => a”
據我了解 Double 應該是 Floating 的一個實體,所以我不明白為什么它不會編譯。
我是haskell 的新手,似乎我不了解資料型別和約束的核心概念。不過,我似乎找不到任何關于該主題的簡單而好的檔案/解釋。也許這里有人可以根據這個例子幫助我理解:)
uj5u.com熱心網友回復:
因為x是一個Int,因此x * x也是一個Int,你不能使用一個Intfor (/) :: Floating a => a -> a -> a。
您需要將其轉換為Double,例如fromIntegral :: (Integral a, Num b) => a -> b:
pi2_approx :: Int -> Double
pi2_approx 1 = 6
pi2_approx x = 6 / fromIntegral (x*x) pi2_approx (x-1)
對于大量迭代,它給出接近π 2的結果:
Prelude> sqrt (pi2_approx 10000)
3.1414971639472147
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/487888.html
上一篇:如何通過決議轉義字串在Haskell中組成未轉義的Unicode字串?
下一篇:寫一個沒有大小寫的空殼函式
