2012-03-28 40 views
1

我想一個列表排序,並檢查我的排序算法正在工作,我希望我想打印出排序列表中的具體內容,這是我所期望的是從列表中打印的元素一個簡單的任務,但被證明是非常困難的 - 我想我會以錯誤的方式去做。在Haskell

data Candidate = Candidate Float Float Float String 

...

getName :: Candidate -> String 
getName (Candidate weight profit effic name) = name 

...

main = do 
    let items = [Candidate 0.20 4.17 (calculateEfficiency 0.20 4.17) "Weapon"] 
    Candidate 3.11 4.53 (calculateEfficiency 3.11 4.53) "Tinned food":items 
    Candidate 1.04 4.64 (calculateEfficiency 1.04 4.64) "Ammunition":items 
    Candidate 2.70 1.19 (calculateEfficiency 2.70 1.19) "Water":items 

    let sortedItems = sortBy mySort items 
    putStrLn (getName (sortedItems !! 0)) 

我得到的錯誤是:

Couldn't match expected type `[b0]' with actual type `IO()' 
In the return type of a call of `putStrLn' 
In the expression: putStrLn (getName (sortedItems !! 0)) 
In the expression: 
    do { let items = ...; 
     Candidate 3.11 4.53 (calculateEfficiency 3.11 4.53) "Tinned food" 
     : items; 
     Candidate 1.04 4.64 (calculateEfficiency 1.04 4.64) "Ammunition" 
     : items; 
     Candidate 2.7 1.19 (calculateEfficiency 2.7 1.19) "Water" : items; 
     .... } 
Failed, modules loaded: none. 

感謝您的幫助。

+0

你認爲那些'Canidate ...:items'行可以做什麼? – delnan 2012-03-28 13:30:56

+1

將候選人添加到列表中 – rhalliwell1 2012-03-28 13:35:33

回答

12

:操作是列出了前置運營商,但它實際上並沒有修改的列表。想象一下,而不是一個列表,你有一個數字;你在做什麼等於這樣:

let items = 1 
2 + items 
7 + items 
3 + items 

這沒有任何意義。

您需要的前置的結果某處。您可以通過創建新的變量,每個步驟做到這一點:

let items = [Candidate 0.20 4.17 (calculateEfficiency 0.20 4.17) "Weapon"] 
let items2 = Candidate 3.11 4.53 (calculateEfficiency 3.11 4.53) "Tinned food" : items 

...或者你可以簡單地創建一個長長的清單開始說起:

let items = [ Candidate 0.20 4.17 (calculateEfficiency 0.20 4.17) "Weapon" 
      , Candidate 3.11 4.53 (calculateEfficiency 3.11 4.53) "Tinned food" 
      , Candidate 1.04 4.64 (calculateEfficiency 1.04 4.64) "Ammunition" 
      ] 

這應該得到預期的結果,根據如果您還正確實施了mySort