Объединить два отсортированных списка в Haskell - PullRequest
5 голосов
/ 03 декабря 2011

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

Это то, что я получил (я знаю, что мне нужен код, чтобы не пытаться извлекать элементы и из пустых списков):

merge :: Ord a => [a] -> [a] -> [a]
merge [] [] = []
merge (h:first) (c:second)  | h <= c = h:merge first (c:second)
                | h > c = c:merge (h:first) second

main = merge ['a','b','c'] ['d','e','f']

Дело в том, что я новичок в Haskell, и я получаю сообщение об ошибке, которое вроде как понимаю, но не знаю, что с этим делать:

Couldn't match expected type `IO t0' with actual type `[Char]'
In the expression: main
When checking the type of the function `main'

Кто-нибудь знает, что это значит? Помощь очень ценится!

Ответы [ 2 ]

8 голосов
/ 03 декабря 2011

main должно быть действием IO. Если вы хотите распечатать список, сделайте что-то вроде этого:

main = print $ merge ['a','b','c'] ['d','e','f']
4 голосов
/ 03 декабря 2011

Обратите внимание, что ваша программа не запускается из-за "неисчерпывающих шаблонов при слиянии функций" (то есть списки длины "1" не учитываются).Более того, вы можете использовать «@», чтобы сделать его более читабельным.

Я бы переписал его как:

merge :: Ord a => [a] -> [a] -> [a]
merge xs [] = xs
merge [] xs = xs
merge a@(h:first) b@(c:second)
        | h <= c = h:merge first b
        | h > c = c:merge a second

main = print $ merge ['a','b','d'] ['c','e','f']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...