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

Lew*_*von 3 haskell guard

我试图将list(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]]
Run Code Online (Sandbox Code Playgroud)

代码如下所示.

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 
Run Code Online (Sandbox Code Playgroud)

Tho*_*mas 6

你不能返回[sack]findItems,因为sack已经是类型的[Item],所以[sack]是一个类型的[[Item]].取下支架.

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

  • 如果你尝试使用GHC编译它,你会得到`'无法匹配期望类型\`Item'与`[sack]`的实际类型\`[Item]'`.您获得的错误消息取决于类型检查算法的实现.拥抱与GHC有所不同. (2认同)