La función de pares tiene que hacer algo como esto:¿Cómo se escribe la función 'pares' en Haskell?
pairs [1, 2, 3, 4] -> [(1, 2), (2, 3), (3, 4)]
La función de pares tiene que hacer algo como esto:¿Cómo se escribe la función 'pares' en Haskell?
pairs [1, 2, 3, 4] -> [(1, 2), (2, 3), (3, 4)]
pairs [] = []
pairs xs = zip xs (tail xs)
simplemente para la corrección, una versión de "bajo nivel" más el uso de la recursividad explícita:
pairs (x:[email protected](y:_)) = (x, y) : pairs xs
pairs _ = []
La construcción x:[email protected](y:_)
medios " una lista con una cabecera x
, y una cola xs
que tiene al menos un elemento y
". Esto se debe a que y
funciona como el segundo elemento del par actual y el primer elemento del siguiente. De lo contrario tendríamos que hacer un caso especial para las listas de longitud 1.
pairs [_] = []
pairs [] = []
pairs (x:xs) = (x, head xs) : pairs xs
'pairs (x: y: rest) = (x, y) : pairs (y: rest) 'también funcionaría, evitando la necesidad de' @ ', aunque a costa de un constructor adicional. – ephemient
Se podía ir tan lejos como
import Control.Applicative (<*>)
pairs = zip <*> tail
pero
pairs xs = zip xs (tail xs)
es probablemente más claro.
¡Genial! Soy un novato, así que me llevó unos 30 minutos entender por qué 'zip <*> tail' funciona, pero valió la pena. Si alguien más tiene curiosidad también, mira aquí: http://stackoverflow.com/questions/11810889/functions-as-applicative-functors-haskell-lyah y, en el proceso, lee el Capítulo 11 de LYAH. Buena cita: _ "Otra instancia de Applicative es (->) r, por lo que funciona. Raramente se usan con el estilo aplicativo fuera del código de golf [...]" _ – Bolo
Según pointfree.io, 'pairs = ap zip tail' también funciona, ya que 'ap' es como' <*> 'pero para mónadas. – Caridorc
de llamadas al dios azteca de números consecutivos:
import Control.Monad (ap)
import Control.Monad.Instances() -- for Monad ((->) a)
foo = zip`ap`tail $ [1,2,3,4]
debe estar bien con sólo la segunda línea desde 'undefined' postal [] es' [] ' – rampion
Oh, tienes razón. No pensé en eso. –
@rampion: Realmente necesitas saber cómo funciona zip para ver si es el caso y significaría que zip (tail xs) xs no funcionaría. Esa no parece una buena manera de escribir un código claro y obvio. –