2016-04-23 3 views
0

Я прохожу через книгу «Семь языков в семинедельной книге», и я работаю с Haskell.Haskell 'Не удалось совместить ожидаемый тип с фактическим типом'

Я борюсь с проблемой:

Написать своего рода, которая принимает список и функцию, которая сравнивает два своих аргумента, а затем возвращает отсортированный список.

Я искал в Интернете помощь и нашел решение, но я даже не могу получить решение для запуска из-за ожидаемой фактической ошибки типа.

Вот код, я пытался:

module Main where 
import Data.List 
sortList :: (Ord a) => (a -> a -> Ordering) -> [a] -> [a] 
sortList comparator list = sortBy comparator list 

Здесь ошибка:

*Main> sortList [5,4,2,7,8,1] 

<interactive>:1:10: 
    Couldn't match expected type `a -> a -> Ordering' 
       with actual type `[t]' 
    In the first argument of `sortList', namely `[5, 4, 2, 7, ....]' 
    In the expression: sortList [5, 4, 2, 7, ....] 
    In an equation for `it': it = sortList [5, 4, 2, ....] 

Мои мысли и попытки:

Может быть, я я неправильно нахожу функцию? Я довольно новичок в Haskell. Я тоже много делал. Все, что я мог заключить, это то, что типы не совпадают. Я полагаю, что объяснение и руководство для скрипта были бы очень полезны для меня.

+1

Ну ваша подпись alrea dy говорит: для вызова 'sortList' требуется' compator', который вы не предоставили ... –

ответ

2

Ваша функция подпись говорит:

"sortList is a function that takes:"

  • function (a -> a -> Ordering) that take two elements of type 'a' and returns an 'Ordering' [this is your comparator]
  • List of items 'a' ([a]) that you are passing it
  • Returns a list of items 'a' ([a])

Попробуйте называть их таким образом:

sortList compare [3,2,1] 

Для более читать здесь: https://hackage.haskell.org/package/base-4.8.2.0/docs/Data-Ord.html

и здесь: http://zvon.org/other/haskell/Outputprelude/compare_f.html

+0

Это сработало. Не могли бы вы вкратце объяснить, почему? – Justin

+0

Вы читали мой комментарий? вам необходимо передать метод компаратора в вашу функцию. «сравнить» - это тот компаратор, в котором вы нуждаетесь. Для получения дополнительного чтения: http://zvon.org/other/haskell/Outputprelude/compare_f.html и здесь: https://hackage.haskell.org/package/base-4.8.2.0/docs/Data -Ord.html – granmirupa

1

Вы неправильно вызываете функцию, вам необходимо передать ей функцию компаратора. Вы просто передаете список функции.

Смежные вопросы