2012-04-16 12 views
5

Digamos que tengo el siguiente:`seq` en las funciones aplicadas parcialmente

f :: a -> b -> c 
g :: b -> c 
g = f 10 

Ahora digamos que es en realidad f:

f x y = f1 x + y 

Would:

g `seq` ... 

realidad evaluar f1 10 , por lo tanto, más adelante cuando se ejecuta

g 9 

en realidad es solo una simple adición?

Si no, ¿hay alguna forma de "evaluar" partes de una función parcialmente aplicada?

Estoy buscando una solución genérica, que no dependa de saber cómo funcionan f y g.

Respuesta

3

seq es poco profunda:

Prelude> let f1 = undefined 
Prelude> let f = \x -> \y -> f1 x + y 
Prelude> let g = f 10 
Prelude> g `seq` 1 
1 
Prelude> g 9 
*** Exception: Prelude.undefined 
Prelude> 

me gustaría echar un vistazo a Control.DeepSeq: http://hackage.haskell.org/packages/archive/deepseq/1.2.0.1/doc/html/Control-DeepSeq.html

+0

que no se parece a lo que puedo aplicar 'deepseq' a las funciones. – Clinton

+0

No, parece que solo se aplica a las estructuras de datos que tienen en cuenta DeepSeq. No es una solución a su problema como se indica. – Deestan

9

No, no lo hará, porque, en general, la elección del lado derecho de f podría depender de y. Si desea compartir el resultado de f1 x entre llamadas a g, que tendría que escribir f así:

f x = let z = f1 x in \y -> z + y 

Por supuesto, debido a la pereza esto no evaluará f1 x hasta la primera vez g se llama. Tener g `seq` ... la evaluación de la fuerza f1 x, que tendría que escribir:

f x = let z = f1 x in z `seq` (\y -> z + y) 
Cuestiones relacionadas