Translate

sábado, 6 de junio de 2020

Let y where en Haskell

El alcance o Scoping es una forma de mantener sus programas ordenados. Implica limitar la región del programa en la que los nombres "existen" y se pueden usar.

En Haskell, una expresión let proporciona un alcance local. Una expresión let tiene una serie de ecuaciones que definen valores variables y una expresión final (después de la palabra clave in) que calcula un valor con esas variables en el alcance.

Aquí hay un ejemplo:

let x = 2
in x*x

Se pueden definir múltiples variables en un solo let

let x = 2
     y = 3
in x+y

Tenga en cuenta que los nombres de las variables se alinean uno debajo del otro. Esta es una buena práctica de formateo, pero también es necesaria para que Haskell interprete el código correctamente. Al igual que Python, el espacio en blanco es importante en Haskell.

A veces, en let, una de las variables puede depender de otra: en la función a continuación, los galones dependen de milespergallon:

journeycost :: Float -> Float -> Float
journeycost miles fuelcostperlitre = 
 let milespergallon = 35
     litrespergallon = 4.55
     gallons = miles/milespergallon
 in (gallons*litrespergallon*fuelcostperlitre)

Aquí hay un ejemplo geométrico:

let diameter = 2*radius
     circumference = pi*diameter
in (diameter, circumference)

Por cierto, pi es una constante definida en el "prelude" de Haskell.

Hay otra sintaxis para introducir variables locales, la cláusula where. Como hemos visto, Haskell es la navaja suiza de los lenguajes de programación: hay muchas formas de hacer las cosas.

La palabra clave where, dentro de una ecuación, proporciona definiciones para las variables que se usan en la ecuación.

Aquí hay un par de ejemplos

squareplusone :: Int -> Int
squareplusone x = xsquared + 1
 where xsquared = x*x

Tengan en cuenta que es necesaria la sangría. 

Como let, podemos tener múltiples variables dentro de una cláusula where:

cel2fahr :: Float -> Float
cel2fahr x = (x*scalingfactor) + freezingpoint
 where scalingfactor = 9.0/5.0
           freezingpoint = 32

Las variables definidas en la cláusula where se alinean una debajo de la otra.

let y where son muy similares:
  • Ambos introducen un alcance local.
  • Ambas permiten escribir cualquier cantidad de ecuaciones.
  • Ambos permiten que las ecuaciones se escriban en cualquier orden, y las variables definidas en cualquier ecuación se pueden usar ("están dentro del alcance") en las otras ecuaciones.
Sin embargo, hay algunas diferencias importantes:
  • let se puede usar en cualquier lugar donde se permita una expresión.
  • where en clasuras que no son expresiones; 
  • let se pueden usar para proporcionar algunas variables locales para una ecuación de nivel superior.