5

私が次のものを持っているとしましょう:

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

さてf、実際に言うことができます:

f x y = f1 x + y

だろう:

g `seq` ...

実際に評価f1 10するので、後で実行するときに

g 9

それは実際には単なる追加ですか?

そうでない場合、部分的に適用された関数の一部を「評価」する方法はありますか?

私は一般的な解決策を探しています。それは方法fg働きを知ることに依存しません。

4

2 に答える 2

9

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

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

もちろん、怠惰のため、これはf1 x最初gに呼び出されるまで評価されません。のg `seq` ...力の評価を行うにはf1 x、次のように記述する必要があります。

f x = let z = f1 x in z `seq` (\y -> z + y)
于 2012-04-16T08:18:58.260 に答える
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.DeepSeqhttp://hackage.haskell.org/packages/archive/deepseq/1.2.0.1/doc/html/Control-DeepSeq.html

于 2012-04-16T08:15:49.127 に答える