【问题标题】:Error in guard condition while combining a list and single item组合列表和单个项目时出现保护条件错误
【发布时间】:2012-05-09 13:06:49
【问题描述】:

我正在尝试将列表头 (r) 添加到列表 sack,但是我不断收到此错误消息。

ERROR "Knapsack.hs":35 - Type error in guarded expression
*** Term           : findItems rt (r : sack) (getTotalWeight sack r)
*** Type           : [Item]
*** Does not match : [[Item]]

代码如下。

findItems :: [Item] -> [Item] -> Float -> [Item]
findItems (r:rt) sack total 
            | total > 20 = [sack]
            | canContinue = findItems rt (r : sack ) (getTotalWeight sack r) 
            | otherwise = [sack] 
            where canContinue = (getTotalWeight sack r) < 20 

【问题讨论】:

    标签: haskell guard


    【解决方案1】:

    您遇到的似乎是“拥抱主义”,其中拥抱似乎以与 GHC 不同的方式进行类型检查。如果您将相同的代码插入 GHCi,您将收到指向实际包含它的行的错误:

    | total > 20 = [sack]
    

    在这种情况下,GHCi 似乎生成了更好的错误消息(尽管恕我直言,通常它们可能比需要的更神秘!)。

    【讨论】:

      【解决方案2】:

      你不能从findItems返回[sack],因为sack已经是[Item]类型,所以[sack][[Item]]类型。去掉括号。

      消息抱怨 second 案例(确实返回[Item])的原因可能是(我在这里猜测)Haskell 期望所有案例都是同一类型,因此它会检查它们是否都与第一个类型相同,错误地恰好是[[Item]]。这种检查似乎发生在它甚至试图协调| 表达式的类型与findItems 的类型之前。 Haskell 大师可能会在这里纠正我的细微之处:)

      【讨论】:

      • 非常感谢,我是 Haskell 的新手,之前犯了这个错误,不认为这是问题所在。
      • 如果你尝试用 GHC 编译它,你会得到 Couldn't match expected type `Item' with actual type `[Item]'[sack]。您收到的错误消息取决于类型检查算法的实现。拥抱与 GHC 不同。
      • 自动类型推断的一般属性是,当存在 类型错误时,通常根本不明显 错误在哪里。所以不同的编译器和解释器会指向代码的不同部分。
      猜你喜欢
      • 1970-01-01
      • 2016-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-18
      • 1970-01-01
      • 1970-01-01
      • 2021-09-19
      相关资源
      最近更新 更多