2010-03-30 24 views
1
-- eg. myzip [’a’, ’b’, ’c’] [1, 2, 3, 4] -> [(’a’, 1), (’b’, 2), (’c’, 3)] 
myzip :: Ord a => [a] -> [a] -> [(a,a)] 
myzip list1 list2 = [(x,y) | [x, _] <-list1, [y,_] <-list2 ] 

Je reçois ce message d'erreur:Quel est le problème avec ma définition de Zip dans Haskell?

Occurs check: cannot construct the infinite type: a = [a] 
    When generalising the type(s) for `myzip' 
Failed, modules loaded: none. 

Répondre

10

Il y a trois problèmes: L'une est la correspondance de motif, on est la signature de type, et on est la nature de la compréhension de la liste. Voici une version corrigée:

{-# LANGUAGE ParallelListComp #-} 
myzip :: [a] -> [b] -> [(a, b)] 
myzip xs ys = [(x, y) | x <- xs | y <- ys] 
  • La signature de type original, [a] -> [a] -> [(a, a)], signifie que les deux listes devaient avoir le même type d'élément. Le Ord a était superflu, et signifiait juste que certains types d'éléments étaient interdits.
  • Le motif [x, _] <- list1 signifie que chaque élément de list1 doit être une liste à deux éléments. Utilisez x <- list1 à la place.
  • Les deux compréhensions de liste sont en série et non en parallèle. Pensez à la virgule comme "Prendre des éléments de liste1, puis de liste2" (série). Pensez aux deux tuyaux comme étant parallèles.

La différence entre les séries et parallèles:

> [[x, y] | x <- "abc", y <- "123"] -- series 
["a1","a2","a3","b1","b2","b3","c1","c2","c3"] 
> [[x, y] | x <- "abc" | y <- "123"] -- parallel 
["a1","b2","c3"] 
+3

Il convient de souligner que les compréhensions de listes parallèles ne sont pas des haskell standard (c'est pourquoi elles doivent être activées en tant qu'extensions ghc). – sepp2k

6

Si vous réécrivant zip afin de mieux comprendre Haskell, je vous suggère que vous essayez de l'écrire sans utiliser compréhensions liste. Les compréhensions de liste sont puissantes, mais sont un peu comme un raccourci pratique pour certains cas particuliers dans Haskell. Et, comme vous le voyez, les utiliser dans d'autres cas peut nécessiter des extensions non standard (telles que ParallelListComp). Pensez à ce que zip doit faire dans le cas général, et que se passe-t-il si le cas général n'est pas rencontré (ce qui peut arriver de deux façons!). Les équations pour la fonction devraient tomber naturellement hors de cela.