【问题标题】:Couldn't match expected type `Bool' with actual type `[[Integer]]无法将预期类型“Bool”与实际类型“[[Integer]] 匹配
【发布时间】:2020-01-17 06:05:46
【问题描述】:

我是 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]

【问题讨论】:

  • 这个问题看起来与另一个问题几乎重复:stackoverflow.com/q/59781958/126014
  • 您是否尝试过与 GHCi 中的这些功能进行交互?您是否尝试过使用 GHCi 的 :type 命令查看类型是什么?

标签: haskell


【解决方案1】:

'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])

那么,在'fun'的定义中使用的列表推导中:

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

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

multiOfFive || squarePrimes n

Haskell 期望它评估为布尔值。但是,“multiOfFive”被调用时没有任何参数,“squarePrimes n”返回一个整数列表,而不是一个布尔值。

在不知道 'fun n' 的确切意图是什么的情况下,我稍微修改了提供的代码,以获得一个加载时不会出错的列表理解:

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

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

【讨论】:

    【解决方案2】:

    我相信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 =&gt; i 是任何整数类型。例如,可能是IntInteger。这是因为整数文字 012 和您使用的算术运算符不限于特定的整数类型。

    您将squarePrimes n 用作Bool

    multiOfFive 的类型为:

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

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

    【讨论】:

      猜你喜欢
      • 2020-02-29
      • 1970-01-01
      • 1970-01-01
      • 2012-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-15
      相关资源
      最近更新 更多