2012-04-16 26 views
5

Diciamo che ho il seguente:`seq` sulle funzioni parzialmente applicate

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

Ora lascia dire f è in realtà:

f x y = f1 x + y 

Would:

g `seq` ... 

effettivamente valutare f1 10 , quindi più tardi durante l'esecuzione di

g 9 

in realtà è solo una semplice aggiunta?

In caso contrario, esiste un modo per "valutare" parti di una funzione parzialmente applicata?

Sto cercando una soluzione generica, che non dipenda dal sapere come funzionano f e g.

risposta

3

seq è superficiale:

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> 

mi piacerebbe prendere uno sguardo a Control.DeepSeq: http://hackage.haskell.org/packages/archive/deepseq/1.2.0.1/doc/html/Control-DeepSeq.html

+0

io non sembra posso applicare 'deepseq' alle funzioni. – Clinton

+0

No, sembra che si applichi solo alle strutture dati che tengono conto di DeepSeq. Non è una soluzione al tuo problema come affermato. – Deestan

9

No, non sarà così, perché in generale, la scelta del lato destro per f potrebbe dipendere y. Se si desidera condividere il risultato di f1 x tra le chiamate al g, si sarebbe dovuto scrivere f in questo modo:

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

Naturalmente, per pigrizia non valuterà f1 x fino la prima volta g si chiama. Per avere g `seq` ... valutazione vigore della f1 x, si dovrebbe scrivere:

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