2010-11-09 3 views
0

Кто-то присоединился к #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])]` 
+0

Возможно, мне что-то не хватает, но с первого взгляда похоже, что функция сравнения, которую вы определяете, - это именно то, что вы сравниваете с экземпляром 'Ord' для' ([Char] , [Char]) ', правильно? –

+0

Иисус Христос. самый замечательный комментарий. очень верно. что он определен для кортежей, довольно круто. –

ответ

3

Попробуйте следующий

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")]) 

Это похоже на опечатку для меня. (:) - это конструктор списка. Использовать (,) для построения кортежа

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