簡體   English   中英

Haskell數字類型的問題

[英]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.

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