簡體   English   中英

Haskell - 簽名和類型錯誤

[英]Haskell - Signature and Type error

我是 Haskell 的新手,我在函數簽名和類型方面遇到了一些問題。 這是我的問題:

我試圖用 1 到 999 之間的每個數字制作一個列表,這些數字可以除以它自己數字的每個數字。 例如,數字 280 可以在該列表中,因為 2+8+0=10 和 280/10 = 28 ...另一方面,123 不能,因為 1+2+3=6 和 123/6=20, 5. 當最后的操作給你一個十進制的數字時,它永遠不會出現在那個列表中。

這是我的代碼:

let inaHelper x = (floor(x)`mod`10)+ (floor(x/10)`mod`10)+(floor(x/100)`mod`10)

第一部分只會對數字的每個數字求和。 這部分工作...

這是最后一部分:

let ina = [x | x <- [1..999] , x `mod` (inaHelper x) == 0   ]

最后一部分應該列出清單並驗證它是否在清單上。 但它給出了這個錯誤:

No instance for (Integral t0) arising from a use of ‘it’
    The type variable ‘t0’ is ambiguous
    Note: there are several potential instances:
      instance Integral Integer -- Defined in ‘GHC.Real’
      instance Integral Int -- Defined in ‘GHC.Real’
      instance Integral Word -- Defined in ‘GHC.Real’
    In the first argument of ‘print’, namely ‘it’
    In a stmt of an interactive GHCi command: print it


...
ina = [x | x <- [1..999] , x `mod` (inaHelper x) == 0   ]

x的類型是什么? Integer ? Int Word 上面的代碼非常通用,適用於任何整數類型。 如果我們嘗試打印它的類型,我們會得到這樣的結果

> :t ina
ina :: (Integral t, ...) => [t]

這意味着結果是我們想要的任何類型t的列表,前提是t是一個整數類型(以及一些其他約束)。

當我們要求 GHCi 打印結果時,GHCi 需要選擇x的類型,但不能明確決定。 這就是錯誤消息所述的內容。

打印結果時嘗試指定類型。 例如

> ina :: [Int]

這將使 GHCi 選擇類型tInt ,消除歧義。

暫無
暫無

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

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