En el wiki sección Haskell Performance Resource, se da la recomendación no se explica más a¿Cuál es la semántica de "retornos estrictos"?
- Use vuelve estrictas (
return $! ...
) a menos que sea absolutamente necesario perezosos.
¿Por qué es que una buena cosa que hacer? ¿Cuándo exactamente es el ...
-expression (Whnf-) forzado?
Dada la "identidad de izquierda" mónada-ley y la definición
f $! x = x `seq` f x
puedo volver a escribir (en do
-notation`):
do x' <- return $! x
f x'
a
do x' <- x `seq` return x
f x'
Pero parece que no puedo obtener
do f $! x
PS: Si el BangPatterns
-Ampliación está disponible, es
do !x' <- return x
f x'
semánticamente lo mismo que la primera do
-expresión dada anteriormente?
veo ... ¿Pero qué dice esto acerca de la utilidad de 'retorno $! ... '? ¿Tiene sentido solo para mónadas estrictas? – hvr
@hvr: si la mónada es estricta en su tipo de devolución, entonces sí. La construcción es especialmente útil para mónadas en las que generalmente se desea evaluar un efecto secundario de la mónada y no la mónada en sí misma. – fuz
Tiene sentido que lo último en un bloque do sea 'return $! ... 'porque el valor de retorno de una función (llamada) siempre se evalúa. Es decir, en '... >> = \ x -> devuelve $! ...', una vez que se llama esa expresión lambda, va a evaluar la aplicación' ($!) '. – augustss