En muchos lenguajes funcionales, como Haskell, la lazy evaluation (evaluación perezosa) es una característica central: los valores no se calculan hasta que realmente se necesitan.
En Elm, en cambio, la evaluación es estricta por defecto (eager evaluation), lo que significa que todos los argumentos de una función se evalúan inmediatamente antes de ser usados.
Veamos un ejemplo simple:
calcular : Int -> Int -> Int
calcular x y =
x + 1
resultado =
calcular 5 (Debug.log "evaluando..." 10)
Al ejecutar este código, veremos en la consola:
evaluando...
Aunque el parámetro y nunca se use, Elm lo evalúa igual, porque siempre evalúa sus argumentos antes de ejecutar la función.
Aunque Elm no es lazy por diseño, sí ofrece el módulo Lazy, que permite diferir la evaluación de expresiones costosas hasta que realmente las necesitemos.
import Lazy exposing (Lazy)
perezoso : Lazy Int
perezoso =
Lazy.lazy (\_ -> 1 + 2)
resultado : Int
resultado =
Lazy.force perezoso
En este caso:
- Lazy.lazy encapsula un cálculo.
- Lazy.force ejecuta el cálculo cuando es necesario.
¿Cuándo usar Lazy?
El módulo Lazy es útil en:
- Estructuras grandes que no siempre se recorren por completo.
- Cálculos costosos que solo se necesitan en ciertas condiciones.
- Simulación de comportamiento perezoso, para optimizar rendimiento.
Sin embargo, Elm sigue favoreciendo la evaluación estricta en la mayoría de los casos, para mantener la simplicidad y la predictibilidad del lenguaje.