私は Haskell を学んでいますが、厳密な評価がいつ、どのように強制されるかについてはまだ完全には明らかではありません
関数にその引数を厳密に評価させたいとき、私は自分自身が書いていることに気づきます
((f $! x) $! y ) $! z
これは奇妙に思えます。$しないでください!私が書くことができるように左結合であること
f $! x $! y $! z
そして、私が望むことをしてもらいますか?
私は $! を完全に誤解していますか? オペレーター?
私は Haskell を学んでいますが、厳密な評価がいつ、どのように強制されるかについてはまだ完全には明らかではありません
関数にその引数を厳密に評価させたいとき、私は自分自身が書いていることに気づきます
((f $! x) $! y ) $! z
これは奇妙に思えます。$しないでください!私が書くことができるように左結合であること
f $! x $! y $! z
そして、私が望むことをしてもらいますか?
私は $! を完全に誤解していますか? オペレーター?
の固定性を反映するためです$
。$
あなたは両方と$!
間違った固定性を持っていることの非常に良いケースを作ることができます.
$
and$!
演算子を左結合にするという haskell-prime の 2008 年の提案を見つけました。
https://ghc.haskell.org/trac/haskell-prime/wiki/ChangeDollarAssociativity
この提案に対する唯一の反論は、「これは多くのコードを壊すだろう」というものです。
代わりに、left-associative を支持する 4 つの引数($)
が与えられます。最後の引数はあなたのものと同じで、最も重要と見なされます。つまり、次のとおりです。
0) 式 が与えられた場合f x y
、2 つのアプリケーションを使用すると、次のように書くことができます。f $ x $ y
1) ここで、右結合を使用すると、次のように($)
記述できます。f . g . h $ x
f $ g $ h $ x
ただし:\x -> f $ g $ h $ x ==> f $ g $ h
は無効です。
コードのクリーンアップが容易になるため、このようなパイプラインを合成で記述する方が優れています
2) 左結合 ($) を使用すると、(.) で削除されたものに加えて、より多くの括弧を削除できます。たとえば、次のようになります。
f (g x) (h y) ==> f $ g x $ h y
3) あなたの議論: の正しい連想バージョンは、$!
次のようなものを生じさせるため不便です((f $! x) $! y) $! z
:f $! x $! y $! z
次のように、コードの先頭でそれらを再定義する、より優れた左結合バージョンのアプリケーション演算子の使用をサポートします。
import Prelude hiding (($), ($!))
infixl 0 $, $!
($), ($!) :: (a -> b) -> a -> b
f $ x = f x
f $! x = x `seq` f x