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]から戻るfindItemsことはできません。sackはすでにタイプ[Item][sack]あり、タイプも[[Item]]です。ブラケットを取り外します。

メッセージが2 番目のケース (正常に返される)について不平を言う理由は、[Item]おそらく (私はここで推測しています) Haskell がすべてのケースが同じ型であると想定しているため、それらがすべて同じ型であることを確認します。最初に、誤って[[Item]]. |このチェックは、式のタイプと のタイプを調整しようとする前に行われるようですfindItems。Haskell の専門家は、おそらくここで細かい点について私を修正することができるでしょう :)

于 2012-04-29T15:41:38.697 に答える
3

あなたが遭遇したのは、Hugs が GHC とは異なる方法で型チェックを行うように見える "Hugs-ism" のようです。同じコードをGHCiにプラグインすると、実際にそれを含む行を指すエラーが発生します:

| total > 20 = [sack]

この場合、GHCi はより適切なエラー メッセージを生成しているように見えます (ただし、私見ですが、通常、必要以上に暗号化されている可能性があります!)。

于 2012-04-29T15:50:59.897 に答える