繁体   English   中英

无法将预期类型“Bool”与实际类型“[[Integer]] 匹配

[英]Couldn't match expected type `Bool' with actual type `[[Integer]]

我是 Haskell 的新手,有一个关于类型的问题,它出错了,因为它无法匹配预期的类型。 我相信squarePrime是一个布尔值,如果我错了,请纠正我,它正在抱怨,因为它想要一个int 谁能解释一下,先谢谢了。

squarePrimes n =  [n^2 | (n) <- [2..n-1], (all (\a -> mod n a /= 0) [2..n-1])]
multiOfFive a = mod a 5 == 0 

fun n = [n | n <-[1..n], multiOfFive || squarePrimes n]

'squarePrimes n' 函数返回整数列表,而不是 Bool 或 Bool 列表。 查看列表理解:

[n^2 | (n) <- [2..n-1], (all (\a -> mod n a /= 0) [2..n-1])]

对于满足条件的每个 n,这将生成一个 n^2 的列表,其中 n 个从范围 [2..n-1] 中提取:

(all (\a -> mod n a /= 0) [2..n-1])

然后,在“乐趣”定义中使用的列表推导式中:

[n | n <-[1..n], multiOfFive || squarePrimes n]

只要满足以下条件,就会构造一个由 1 到 n 范围内的每个 n 组成的列表:

multiOfFive || squarePrimes n

Haskell 期望它评估为 Bool。 然而,'multiOfFive' 是在没有任何参数的情况下调用的,并且 'squarePrimes n' 返回一个整数列表,而不是一个 Bool。

在不知道“fun n”的确切意图的情况下,我对提供的代码进行了一些更改,以获得无错误加载的列表理解:

fun n = [n | n <- [1..n], (multiOfFive n) || (elem n (squarePrimes n))]

现在,它使用 'elem' 函数来检查给定的 'n' 是否是列表 'squarePrimes n' 的一个元素。

我相信squarePrimes是一个布尔值,如果我错了,请纠正我

GHCi 会告诉你:

λ> let squarePrimes n = [n^2 | (n) <- [2..n-1], (all (\a -> mod n a /= 0) [2..n-1])]
λ> :t squarePrimes 
squarePrimes :: Integral a => a -> [a]

它抱怨是因为它想要一个int 有人能解释一下吗

这里Integral i => i是任何整数类型。 例如,这可能是IntInteger 这是因为整数文字012和您使用的算术运算符不限于特定的整数类型。

您正在使用squarePrimes n作为Bool

您还使用multiOfFiveBool时,它的类型是:

λ> let multiOfFive a = mod a 5 == 0 
λ> :t multiOfFive 
multiOfFive :: Integral a => a -> Bool

所以一个接受整数类型并返回一个Bool的函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM