Question

--  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:

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

La solution

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 voulait juste dire que certains types d'éléments ont été rejetés.
  • Le motif [x, _] <- list1 signifie que chaque élément de list1 doit être une liste à deux éléments. Utilisez plutôt x <- list1.
  • Les deux compréhensions de liste sont en série au lieu de parallèle. Pensez à la virgule comme « Prenez des éléments de list1, puis de liste2 » (série). Penser des deux tuyaux comme étant parallèles.

La différence entre série et en parallèle:

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

Autres conseils

Si vous réécrivant zip afin de mieux comprendre Haskell, je suggère que vous essayez d'écrire sans utiliser la liste compréhensions. Liste compréhensions sont puissants, mais sont un peu comme un raccourci commode pour certains cas particuliers dans Haskell. Et, comme vous le voyez, pour les utiliser dans d'autres cas, peut nécessiter des extensions non standard (comme ParallelListComp).

Pensez à ce que zip doit faire dans le cas général, et ce qui se passe si le cas général n'est pas remplie (ce qui peut arriver de deux façons!). Les équations de la fonction doivent tomber naturellement de cela.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top