2013-05-10 95 views
3

我一直在盯着這段代碼很長一段時間了,我無法理解這個錯誤信息。Haskell:實際類型'Int'無法預期類型'Integer'

divisors :: Integer -> [Integer] 
divisors n = [t | t <- [1..n], mod n t == 0] 

length' :: [a] -> Integer 
length' []  = 0 
length' (x:xs) = 1 + length' xs 

divLengths :: [(Integer, Integer)] 
divLengths = [(n, length' (divisors n)) | n <- [1..]] 

divLengths' :: [Integer] 
divLengths' = [length' (divisors n) | n <- [1..]] 

hcn :: [Integer] 
hcn = [n | n <- [1..], max (take n divLengths') == length' (divisors n)] 

「除數」取整數並返回一個列表及其所有除數。

「長度」與內置的「長度」相同,只有它返回一個整數。

「divLengths」是Integer的元組的無限列表及其除數的個數。

「divLengths」只返回數字的除數。

「hcn」應該是一個高度複合數字的無限列表(如果除數的數目與所有數字的所有除數的最大數目相同(直到被檢查的數字))。

不過,我得到試圖加載名爲.hs在ghci中,當這個錯誤:

Couldn't match expected type `Integer' with actual type `Int' 
In the first argument of `divisors', namely `n' 
In the first argument of length', namely `(divisors n)' 
In the second argument of `(==)', namely `length' (divisors n)' 

能否請你幫我在這裏?

最好的問候, 盧卡斯

回答

9

的問題是,take需要一個Int,因此GHC從該n必須Int推斷。沒問題,您可以使用fromIntegral在任何整型之間進行轉換。

max還有另一個問題,它應該有兩個參數。您可能打算使用maximum,它取而代之。

嘗試這樣:

hcn :: [Integer] 
hcn = [n | n <- [1..], maximum (take (fromIntegral n) divLengths') == length' (divisors n)] 
相關問題