¿Por qué la siguiente secuencia de comandos de Haskell no funciona como se esperaba?Variables en Haskell
find :: Eq a => a -> [(a,b)] -> [b]
find k t = [v | (k,v) <- t]
Dada find 'b' [('a',1),('b',2),('c',3),('b',4)]
, el intérprete vuelve [1,2,3,4]
en lugar de [2,4]
. La introducción de una nueva variable, a continuación denominado u
, es necesario conseguir que esto funcione:
find :: Eq a => a -> [(a,b)] -> [b]
find k t = [v | (u,v) <- t, k == u]
¿Alguien sabe por qué la primera variante no produce el resultado deseado?
Repita después de mí: no hay variables en Haskell. ;-) Estos son símbolos o identificadores. Las variables implican variabilidad. En Haskell, todo es inmutable. –
@Konrad Rudolph: El Informe Haskell 98 utiliza el término "variable" en todas partes. Es importante tener en cuenta que esto no significa lo que podría esperar, pero no creo que sea más perspicaz que la documentación estándar que necesariamente es útil. –
@Konrad Rudolph: ¡Seguro que bromeas! Vaya, encontré una sección completa sobre variables [en algunos Haskell, aquí] (http://books.google.com/books?id=27dkTJFrLZIC&pg=PA111). –