组合列表和单个项目时保护条件出错

时间:2012-04-29 15:35:28

标签: haskell guard

我正在尝试将列表的头部(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 

2 个答案:

答案 0 :(得分:6)

您无法从[sack]返回findItems,因为sack已经是[Item]类型,因此[sack]的类型为[[Item]]。删除括号。

消息抱怨第二个情况(确实应该返回[Item])的原因可能是(我猜这里)Haskell期望所有情况都是相同类型,因此它检查它们是否与第一个类型相同,错误地恰好是[[Item]]。此检查似乎在它甚至尝试将|表达式的类型与findItems类型进行协调之前发生。 Haskell大师可能会在这里更好地纠正我:)

答案 1 :(得分:3)

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

| total > 20 = [sack]

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