研究実験として、私は最近、デフォルトで厳密な Haskell モジュールの実装に取り組みました。デフォルトで怠惰でエスケープ ハッチを使用する代わりに、デフォルトで!
厳密でエスケープ ハッチを使用します~
。この動作は、{-# LANGUAGE Strict #-}
プラグマを使用して有効にします。
パターンを厳密にすることに取り組んでいるときに、興味深い質問に出くわしました。「トップレベル」のみでパターンを厳密にするか、すべてのバインド変数でパターンを厳密にする必要があるかということです。たとえば、
f x = case x of
y -> ...
y
Haskell がそうしないとしても、私たちは強制します。もっとトリッキーなケースは
f x = case x of
Just y -> ...
と解釈すべきでしょうか。
f x = case x of
Just y -> ... -- already strict in 'x' but not in `y`
また
f x = case x of
Just !y -> ... -- now also strict in 'y'
(ここでは通常の遅延 Haskell を使用していることに注意してくださいJust
。)
価値があると思われる設計上の制約の 1 つは、プラグマをモジュール化することです。たとえば、Strict
オンにしても、他のモジュールで定義された関数への引数を評価しません。それはそれを非モジュール化するでしょう。
ここに先行技術はありますか?