Pregunta

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

Me sale este mensaje de error:

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

Solución

Hay tres problemas: Uno es la coincidencia de patrones, es la firma de tipo, y uno es la naturaleza de la lista por comprensión. Aquí es una versión corregida:

{-# LANGUAGE ParallelListComp #-}
myzip :: [a] -> [b] -> [(a, b)]
myzip xs ys = [(x, y) | x <- xs | y <- ys]
  • La firma de tipo original, [a] -> [a] -> [(a, a)], hecho que ambas listas tenían que tener el mismo tipo de elemento. El Ord a era superfluo, y simplemente significa que se desecharon ciertos tipos de elementos.
  • Los medios patrón [x, _] <- list1 que cada elemento de list1 debe ser una lista de dos elementos. Uso x <- list1 lugar.
  • Las dos listas por comprensión están en serie en lugar de en paralelo. Piense en la coma como: "Toma elementos de lista1, a continuación, a partir lista2" (serie). Piense en los dos tubos de ser paralelo.

La diferencia entre serie y en paralelo:

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

Otros consejos

Si vuelve a escribir zip con el fin de obtener detalles del informe Haskell, me gustaría sugerir que intenta escribir sin usar listas por comprensión. Las listas por comprensión son poderosos, pero son algo así como una taquigrafía conveniente para algunos casos particulares en Haskell. Y, como se ve, para utilizarlos en otros casos podría requerir extensiones no estándar (tales como ParallelListComp).

Piense en lo zip tiene que hacer en el caso general, y lo que sucede si no se cumple el caso general (lo que puede ocurrir de dos maneras!). Las ecuaciones para la función debe caer naturalmente de eso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top