2010-11-09 3 views
0

Quelqu'un a rejoint #haskell, et a demandé une question de devoirs assez novice. Comment trier deux listes de longueur égale de tuples de chaîne? Dans une tentative pour les aider - mon Haskell suce - j'ai écrit ceci.Type question d'unification avec des listes de tuples de chaînes

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

Je suppose que c'est loin de fonctionner. Pourquoi pas ce travail:

sortBy (\(x:y) (x':y') -> undefined) $ [("a","b"),("e","b"),("x","b"),("x","g"),("b","c"),("b","d"),("g","a"),("g","c")] 

Je reçois cette erreur

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

je mettrais ces derniers sur plusieurs lignes, mais je ne sais pas où je dois les casser pour les faire fonctionner (Les espaces blancs de Haskell sont maladroits).

SortBy a un type de sortBy :: (a -> a -> Ordering) -> [a] -> [a] et ma liste a un type de [([Char], [Char])]

Comment se fait-a ne peut être unifiée avec ([Char], [Char]) pour faire

sortBy :: (([Char], [Char]) -> ([Char], [Char]) -> Ordering) -> [([Char], [Char])] -> [([Char], [Char])]` 
+0

Il se peut que je manque quelque chose, mais en un coup d'œil, il semble que la fonction de comparaison que vous définissez soit exactement la 'comparaison' que vous obtenez de l'instance' Ord' pour '([Char] , [Char]) ', n'est-ce pas? –

+0

Jésus Christ. Commentaire le plus impressionnant jamais. très vrai. qu'il a été défini pour tuples est assez cool. –

Répondre

3

Essayez la prochaine

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

Cela ressemble à une faute de frappe pour moi. (:) est un constructeur de liste. Utilisez (,) pour construire un tuple

Questions connexes