[英]problems with Haskell's Number Types
我有以下haskell代碼:
fac n = product [1..n]
taylor3s w0 f f' f'' t h = w1 : taylor3s w1 f f' f'' (t+h) h
where hp i = h^i / fac i
w1 = w0 + (hp 1) * f t w0 + (hp 2) * f' t w0 + (hp 3) * f'' t w0
taylor_results = take 4 $ taylor3s 1 f f' f'' 1 0.25
where f t x = t^4 - 4*x/t
f' t x = 4*t^3 - 4*(f t x)/t + 4*x/t^2
f'' t x = 12*t^2 - 4*(f' t x)/t + 8*(f t x)/t^2 - 8*x/t^3
taylor_results應該是taylor3s的用例。 但是,數字類型推斷存在問題。 當我嘗試編譯時,這是我得到的錯誤:
practice.hs:93:26:
Ambiguous type variable `a' in the constraints:
`Integral a'
arising from a use of `taylor3s' at practice.hs:93:26-51
`Fractional a' arising from a use of `f' at practice.hs:93:37
Possible cause: the monomorphism restriction applied to the following:
taylor_results :: [a] (bound at practice.hs:93:0)
Probable fix: give these definition(s) an explicit type signature
or use -XNoMonomorphismRestriction
有人可以幫助我理解問題是什么嗎?
由於您的混合操作僅適用於僅在小數上可用的積分和運算(特別是您使用^
,其中第二個操作數必須是整數 - 如果您希望兩個操作數具有相同的浮點類型,請使用**
) ,haskell推斷所有參數和taylor3s
的結果都具有類型Fractional a, Integral a => a
。 這不是類型錯誤,因為理論上這種類型可能存在,但它很可能不是你想要的,因為在實踐中這種類型不存在。
無論如何你得到一個類型錯誤的原因是taylor_results
的推斷類型因此也是Fractional a, Integral a => a
這是多態的,因此違反了單態限制 。
如果你明確地將taylor_results
聲明為taylor_results :: Fractional a, Integral a => a
或禁用單態限制,整個事情就會編譯,但是不可能使用(沒有定義實際實例化Integral和Fractional的類型,這將是廢話)。
請注意,如果解決這個(例如,通過替換
^
與
**
)的種類
taylor_results
仍將是多態的(它將被推斷為
taylor_results :: (Floating a, Enum a) => [a]
這實際上是明智),所以你仍然會遇到單態限制。
所以你仍然需要關閉限制,明確地聲明
taylor_results
的類型是多態的,或者顯式地聲明
taylor_results
類型是實例化Floating和Enum的特定類型(例如Double)。
請注意,除非您執行后者,
taylor_results
每次使用時都會重新計算
taylor_results
(這就是存在單態限制的原因)。
請注意,如果解決這個(例如,通過替換^
與**
)的最普遍的類型taylor_results
將(Floating a, Enum a) => [a]
但類型你得到(除非你禁用單態限制)將是[Double]
。 如果你不想要雙打,你要么必須明確聲明taylor_results屬於另一種類型(實例化Floating和Enum)或者是多態的。 請注意,如果您將其聲明為多態,則每次使用時都會重新計算taylor_results
(這就是存在單態限制的原因)。
似乎Haskell推斷taylor3s
作為一個Integral
類型的返回,但事實上子函數f
等被推斷為處理Fractional
類型違反了該推論。
也許通過明確地告訴Haskell, taylor3s
返回類型可能有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.