Печать элемента из списка в Haskell - PullRequest
1 голос
/ 28 марта 2012

Я пытаюсь отсортировать список и проверить, что мой алгоритм сортировки работает так, как я ожидал бы, я хотел бы распечатать определенные элементы отсортированного списка, что я ожидал бы быть простой задачей, но оказывается очень сложно - думаю, я поступаю неправильно.

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.

Спасибо за любую помощь.

1 Ответ

12 голосов
/ 28 марта 2012

Оператор : является оператором предварительного добавления для списков, но на самом деле он не изменяет список. Представьте, что вместо списка у вас был номер; то, что вы делаете, эквивалентно этому:

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.

...