![](/img/trans.png)
[英]Couldn't match expected type ‘Integer -> t’ with actual type ‘Bool’
[英]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
是任何整数类型。 例如,这可能是Int
或Integer
。 这是因为整数文字0
、 1
、 2
和您使用的算术运算符不限于特定的整数类型。
您正在使用squarePrimes n
作为Bool
。
您还使用multiOfFive
为Bool
时,它的类型是:
λ> let multiOfFive a = mod a 5 == 0
λ> :t multiOfFive
multiOfFive :: Integral a => a -> Bool
所以一个接受整数类型并返回一个Bool
的函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.