domingo, julio 22, 2007

Estricto o Perezoso? 2

Bueno... ya no me rinde tanto la escritura por acá pero continuo con el tema.

Pues bien, estaba el problema de querer forzar a que Haskell evaluara en forma estricta y existen varias alternativas para hacer esto.

Casi Tooodo lo saque de acá

Existe una técnica llamada CPS, pero a mi parecer solo ofusca el código. Asi que pasaré directamente a seq

La primitiva seq de Haskell hace lo siguiente, dado x seq y, se revisa que x no sea _|_ (bottom), se descarta el resultado y se pasa a evaluar y.

Este mecanismo pareciera estúpido, pero con este se pueden hacer cositas como la siguiente. Digamos que queremos forzar la evaluación de y en esta función foo x y

Podemos hacer
foo x y | y seq True = f y 
| otherwise = undefined


Otra forma de forzar la evaluación es mediante el operador $!

el cual está definido así

f $! x = x seq f x


Esto quiere decir que x $! y $! z
Evalúa z, después evalúa y y se lo aplica a z y hace lo mismo con y.

Por último si se está utilizando ghc, se puede utilizar la extensión de bang patterns. La cual permite de una vez en el pattern matching de una función evaluar en forma estricta. Siguiendo el ejemplo de foo es simplemente hacer lo siguiente.

foo x !y = f y


En fin espero que esto le sirva a alguien :)

1 comentario:

La Encargada dijo...

mmm seguramente a alguien habrá de servirle eso.. pero yo no soy una de las afortunadas.. Yo solo paso a dejar comentarios bobos como "hola, pasaba a saludar".

Cumplí con mi objetivo.. seguiré leyendo blogs.. :D un abrazo