2012-04-16 14 views
5

は、私は、次のしているとしましょう:`部分的に適用された機能のseq`

f x y = f1 x + y 

ます:

g `seq` ... 

が実際にf1 10を評価

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

は今fが実際にあると言うことができますので、後で実行するとき

g 9 

実際には単純な追加ですか?

もしそうでなければ、部分的に適用された関数の部分を「評価する」方法がありますか?

fgがどのように機能するかに依存しない一般的なソリューションを探しています。

答えて

3

seqは浅いです:

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> 

私はControl.DeepSeqを見てみたい:http://hackage.haskell.org/packages/archive/deepseq/1.2.0.1/doc/html/Control-DeepSeq.html

+0

私は見ていません。 – Clinton

+0

いいえ、DeepSeqを考慮に入れたデータ構造にのみ適用されるようです。あなたの問題を解決するものではありません。 – Deestan

9

いいえ、それはしませんが、一般的には、fための右側の選択が依存する可能性があるため、 y。あなたはgへの呼び出しの間f1 xの結果を共有したい場合は、このようfを記述する必要があります:もちろん

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

、これが初めてgまでf1 xを評価しません怠惰が原因と呼ばれています。 f1 xg `seq` ...力の評価を持っているために、次のように記述する必要があります:私は関数に `deepseq`を適用することができますように

f x = let z = f1 x in z `seq` (\y -> z + y) 
関連する問題