从Haskell中的列表中打印元素

rha*_*ll1 1 printing sorting haskell list ghci

我正在尝试对列表进行排序,并检查我的排序算法是否正常工作,因为我希望我打印出排序列表中的特定元素,我希望这是一个简单的任务,但事实证明非常困难 - 我想我会以错误的方式去做.

data Candidate = Candidate Float Float Float String
Run Code Online (Sandbox Code Playgroud)

...

getName :: Candidate -> String
getName (Candidate weight profit effic name) = name
Run Code Online (Sandbox Code Playgroud)

...

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

我得到的错误是:

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

谢谢你的帮助.

dfl*_*str 12

:操作是列出了前置运营商,但它实际上并没有修改的列表.想象一下,你有一个数字,而不是一个列表; 你在做什么相当于这个:

let items = 1
2 + items
7 + items
3 + items
Run Code Online (Sandbox Code Playgroud)

这没有任何意义.

你需要在某处存储 prepend的结果.您可以通过为每个步骤创建新变量来执行此操作:

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

...或者你可以简单地创建一个长列表开头:

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

这应该产生预期的结果,具体取决于您是否也mySort正确实施.