2011-04-15 19 views
15

me encontré con este código cortado con tijeras en el Internet:apóstrofo en identificadores en Haskell

digits 0 = [0] 
digits n = digits' n [] 
    where digits' 0 ds = ds 
     digits' n ds = let (q,r) = quotRem n 10 
         in digits' q (r:ds) 

sumOfDigits = sum . digits 

Puede alguien explicar rápidamente lo que el signo "'" (digits n = digits' n []) después de la llamada a la función recursiva es para? He visto algunos otros ejemplos de código en Haskell (tutoriales), pero no entiendo este. Se agradece una explicación rápida.

+0

Personalmente trato de evitar el uso de apóstrofes en mis identificadores porque soy un gran admirador de las frases descriptivas y significativas. – jcarpenter2

Respuesta

30

El apóstrofo es solo una parte del nombre. Es una convención de nomenclatura (modismo) adoptada en Haskell.

La convención en Haskell es que, like in math, el apóstrofo en un nombre de variable representa una variable que de alguna manera está relacionada, o similar, a una variable anterior.

Un ejemplo:

let x = 1 
    x' = x * 2 
in x' 

x' se relaciona con x, y nos indican que con el apóstrofe.


Puede ejecutar esto en GHCi, por cierto,

Prelude> :{ 
Prelude| let x = 1 
Prelude|  x' = x * 2 
Prelude| in x' 
Prelude| :} 
2 
+0

Su ejemplo no funciona. Ni en un archivo .hs ni directamente escrito en el Intérprete. – kiltek

+0

@ user504060: prueba 'let {x = 1; x '= x * 2} en x''. (Las construcciones de línea múltiple no funcionan como está en ghci, y las expresiones no van al nivel superior de un archivo fuente de Haskell). – dave4420

+1

Es una expresión de Haskell. He editado la respuesta para mostrar cómo puedes evaluar expresiones de líneas múltiples en GHCi. –

7

Es sólo otro carácter permitido en los identificadores. Piense en ello como otra carta.

Cuestiones relacionadas