簡體   English   中英

對 Haskell 中數據類型的困惑

[英]Confusion about data types in Haskell

我必須編寫一個簡單的 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 type Int' 匹配
  • 在表達式中: (+) (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 的新手,似乎我不了解數據類型和約束的核心概念。 不過,我似乎找不到任何關於該主題的簡單而好的文檔/解釋。 也許這里有人可以根據這個例子幫助我理解:)

因為xInt ,因此x * x也是Int ,並且不能將Int用於(/) :: 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM