3

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

2 回答 2

6

你不能返回[sack]from findItems,因为sack已经是 type [Item],所以[sack]也是 type [[Item]]。拆下括号。

消息抱怨第二种情况(它确实返回[Item])的原因可能是(我在这里猜测)Haskell 期望所有情况都是相同的类型,所以它检查它们是否都是相同的类型作为第一个,它恰好是[[Item]]. 这种检查似乎发生在它甚至尝试将|表达式的类型与findItems. Haskell 大师可能会在这里更详细地纠正我:)

于 2012-04-29T15:41:38.697 回答
3

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

| total > 20 = [sack]

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

于 2012-04-29T15:50:59.897 回答