2010-03-30 14 views

Respuesta

39
pairs [] = [] 
pairs xs = zip xs (tail xs) 
+21

debe estar bien con sólo la segunda línea desde 'undefined' postal [] es' [] ' – rampion

+0

Oh, tienes razón. No pensé en eso. –

+0

@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. –

6

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 
+4

'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

20

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.

+1

¡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

+0

Según pointfree.io, 'pairs = ap zip tail' también funciona, ya que 'ap' es como' <*> 'pero para mónadas. – Caridorc

2

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