我正在玩初學者哈斯克爾,我想寫一個平均功能。這似乎是世界上最簡單的事情,對吧?Haskell類型令人沮喪的一個簡單的'平均'功能
錯誤。
看起來Haskell的類型系統禁止使用泛型數字類型的平均值 - 我可以讓它在Integrals列表或Fractionals列表上工作,但不能同時使用它們。
我想:
average :: (Num a, Fractional b) => [a] -> b
average xs = ...
但我只能得到:
averageInt :: (Integral a, Fractional b) => [a] -> b
averageInt xs = fromIntegral (sum xs)/fromIntegral (length xs)
或
averageFrac :: (Fractional a) => [a] -> a
averageFrac xs = sum xs/fromIntegral (length xs)
,第二個似乎工作。直到我嘗試傳遞一個變量。
*Main> averageFrac [1,2,3]
2.0
*Main> let x = [1,2,3]
*Main> :t x
x :: [Integer]
*Main> averageFrac x
<interactive>:1:0:
No instance for (Fractional Integer)
arising from a use of `averageFrac ' at <interactive>:1:0-8
Possible fix: add an instance declaration for (Fractional Integer)
In the expression: average x
In the definition of `it': it = averageFrac x
顯然,Haskell對它的類型真的很挑剔。這就說得通了。但不是當他們都可以[數字]
我是否缺少一個明顯的RealFrac應用程序?
是否有辦法強制積分成小數部分,當它得到分數輸入時不會窒息?
是否有某種方法可以使用Either
和either
來生成某種可以在任何類型的數值數組上工作的多態平均函數?
Haskell的類型系統是否完全禁止這個函數存在?
學習Haskell就像學習微積分。它非常複雜,基於理論的高峯,有時問題非常複雜,以至於我甚至不知道正確地提出問題,所以任何見解都會被熱烈接受。 (另外,腳註:這是基於一個家庭作業問題,每個人都同意averageFrac,上面得到滿分,但我有一個偷偷摸摸的懷疑,有一種方法可以使它在Integral和Fractional數組上工作)
http:// stackoverflow。com/questions/1816993/haskell-dividing-num –