Кто-то присоединился к #haskell
и задал довольно новый вопрос о домашнем задании. Как вы сортируете два одинаковых списка строк кортежей? В попытке помочь им - мой Haskell сосет - я написал это.Вопрос о объединении типов со списками кортежей строк
sortBy (\(x:y) (x':y') -> let { a = x `compare` x'; b = y `compare` y' } in if a == EQ then b else a) $ let f (a,b) = a++b in f ([("a", "b"), ("e", "b"), ("x", "b"), ("x", "g")], [("b", "c"),("b", "d"), ("g", "a"), ("g", "c")])
Я предполагаю, что это далеко не работает. Почему это не работает:
sortBy (\(x:y) (x':y') -> undefined) $ [("a","b"),("e","b"),("x","b"),("x","g"),("b","c"),("b","d"),("g","a"),("g","c")]
Я получаю эту ошибку
<interactive>:1:67:
Couldn't match expected type `[t]'
against inferred type `([Char], [Char])'
In the expression: ("a", "b")
In the expression: [("a", "b"), ("e", "b"), ("x", "b"), ("x", "g")]
In the first argument of `f', namely
`([("a", "b"), ("e", "b"), ("x", "b"), ("x", "g")],
[("b", "c"), ("b", "d"), ("g", "a"), ("g", "c")])'
Я бы поставил их на несколько строк, но я не уверен, где я должен разбить их, чтобы сделать их работу (Пробелы Haskell тупой).
SortBy имеет тип sortBy :: (a -> a -> Ordering) -> [a] -> [a]
и мой список имеет тип [([Char], [Char])]
Как прийти a
не могут быть объединены с ([Char], [Char])
сделать
sortBy :: (([Char], [Char]) -> ([Char], [Char]) -> Ordering) -> [([Char], [Char])] -> [([Char], [Char])]`
Возможно, мне что-то не хватает, но с первого взгляда похоже, что функция сравнения, которую вы определяете, - это именно то, что вы сравниваете с экземпляром 'Ord' для' ([Char] , [Char]) ', правильно? –
Иисус Христос. самый замечательный комментарий. очень верно. что он определен для кортежей, довольно круто. –