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

不能從findItems返回[sack],因爲sack已經[Item]型的,所以[sack][[Item]]類型。刪除括號。

消息埋怨情況下(這確實返回[Item],因爲它應該)是可能的原因(我猜在這裏)是哈斯克爾希望所有的案件是同一類型的,所以它會檢查他們'與第一個相同,不正確的是[[Item]]。這種檢查似乎在它甚至試圖調和|表達式的類型和findItems的類型之前就發生了。哈斯凱爾大師可能會糾正我在這裏的更好的點:)

+1

非常感謝你,我是Haskell的新手,早期犯了這個錯誤,並不認爲這是問題所在。 –

+2

如果您嘗試使用GHC進行編譯,您會得到'無法與'[sack]'的實際類型\ [[Item]'匹配預期類型\ Item'')。您獲得哪個錯誤消息取決於類型檢查算法的實現。擁抱與GHC不同。 –

+0

自動類型推斷的一般屬性是,當發現類型錯誤時,它通常並不明顯是錯誤所在。所以不同的編譯器和解釋器會指向代碼的不同部分。 – MathematicalOrchid

3

你碰到什麼似乎是一個「擁抱主義」,其中擁抱似乎做的類型檢查以不同於GHC的方式。如果您將相同的代碼輸入GHCI你會得到指向實際包含它的行錯誤:

| total > 20 = [sack] 

在它出現GHCI這種情況下,產生更好的錯誤信息(雖然,恕我直言,他們通常可以更比需要神祕!)。