2008-12-05 21 views
20

Una pregunta un poco neófita de haskell, pero encontré este ejemplo en Haskell's tutorial examples. Para "encontrar el último elemento de una lista" hay algunas versiones obvias, comoAplicación de función Haskell

last' [x] = x 
last' (_:xs) = last' xs 

Pero no pueden dar sentido a una versión alternativa presenta:

myLast' = foldr1 (const id) 

Así, al tratar de hacer sentido de lo que la aplicación de la función de Identificación está haciendo, he intentado en ghci:

const id 1 2 -> gives 2 

esto se une de esta manera:

(const id) 1 2 -> gives 2 

Y no como esto:

const (id 1) 2 -> gives 1 

Pero no voy a dar sentido a esto. (const id) debería traducirse en algo así como

`(\x y->x) (\x->x)` 

No debería devolver una función que simplemente devuelve el id de su primer elemento? O bien, ¿cómo se comporta la creación de orden de función (id de const) de manera diferente que const?

+1

¡Bienvenido al club 10k! –

+3

Me gustaría agradecer a la academia, a mi productor, al director .... –

+0

loooooooool! Como: P – Nomics

Respuesta

30

La definición de const es

const x = \_ -> x 

Por lo tanto, (const id) es una función que toma un argumento y siempre devuelve id y

const id 1 2 = (\_ -> id) 1 2 
      = id 2 
      = 2 

La definición de foldr1 es

foldr1 f [x] = x 
foldr1 f (x:xs) = f x (foldr1 f xs) 

Si tenemos

myLast' = foldr1 (const id) 

continuación

myLast' [x] = foldr1 (const id) [x] 
       {- definition of foldr1 -} 
      = x 

y

myLast' (x:xs) = foldr1 (const id) (x:xs) 
       {- definition of foldr1 -} 
       = (const id) x (foldr1 (const id) xs) 
       {- definition of const -} 
       = (\_ -> id) x (foldr1 (const id) xs) 
       {- function application -} 
       = id (foldr1 (const id) xs) 
       {- definition of id -} 
       = foldr1 (const id) xs 
       {- definition of myLast' -} 
       = myLast' xs 

lo cual concuerda con la definición de last'.

+1

ahhh. No hizo la conexión del const que devuelve la función. Gracias por la explicación. –

+0

Esta es una gran explicación, y al recorrerla puedo ver cómo funciona. ¿Pero es foldr1 (const id) realmente la forma idiomática de hacer una función myLast? El primer ejemplo dado parece mucho más claro ... –

+2

No diría que es idiomático ...Los geeks de Haskell disfrutan de cómo expresar las cosas en un estilo "sin puntos", o puramente en términos de pliegues. Se convierte en un tipo de rompecabezas de programación. La primera versión es mucho más clara. –

9

Confío mucho en :t cuando trato de entender a Haskell. En este caso:

Prelude> :t const id 
const id :: b -> a -> a

podrían haber ayudado a ver lo que estaba pasando.

+3

Para aclarar, ": t" es un comando que puede usar en GHCI para imprimir el tipo de una expresión. –

Cuestiones relacionadas