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
正确实施.