2012-04-29 7 views
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 

答えて

6

sackはタイプ[Item]で既にあるので、[sack]はタイプ[[Item]]であるので、あなたは、findItemsから[sack]を返すことはできません。ブラケットを取り外します。メッセージは、(それが必要として[Item]を返さない)ケース文句

理由はおそらく、Haskellはすべての場合は、同じタイプであることを期待し、それが彼らことを確認することを(私はここで推測している)されます最初のものと同じ種類のものはすべて、間違って[[Item]]になります。このチェックは、式のタイプをfindItemsのタイプと照合する前に行われるように見えます。ハスケルスの指導者は、おそらくここで細かい点で私を修正することができます:)

+1

ありがとう、私はハスケルに新しいですし、以前の間違いをして、それが問題だとは思わなかった。 –

+2

GHCでコンパイルしようとすると、期待される型\ 'Item 'と' [Sack] 'のための実際の型\' [Item]' 'を一致させることができません。どのエラーメッセージが表示されるかは、型チェックアルゴリズムの実装によって異なります。ハグスはそれをGHCとは違う。 –

+0

自動型推論の一般的な性質は、タイプエラーが発生した場合、エラーが完全にはっきりしないことです。異なるコンパイラとインタプリタはコードの異なる部分を指します。 – MathematicalOrchid

3

あなたはHugsがGHCとは別の方法で型チェックを行うように見える "Hugs-ism" 。一般的に、彼らはより多くのことができ、私見、が(より良いエラーメッセージを生成していることがGHCiのが表示されます。この場合、

| total > 20 = [sack] 

:あなたはGHCiのに同じコードを差し込む場合は、実際にそれを含む行を指してエラーになります秘密の必要以上に!)。

関連する問題