6

研究実験として、私は最近、デフォルトで厳密な Haskell モジュールの実装に取り​​組みました。デフォルトで怠惰でエスケープ ハッチを使用する代わりに、デフォルトで!厳密でエスケープ ハッチを使用します~。この動作は、{-# LANGUAGE Strict #-}プラグマを使用して有効にします。

パターンを厳密にすることに取り組んでいるときに、興味深い質問に出くわしました。「トップレベル」のみでパターンを厳密にするか、すべてのバインド変数でパターンを厳密にする必要があるかということです。たとえば、

f x = case x of
  y -> ...

yHaskell がそうしないとしても、私たちは強制します。もっとトリッキーなケースは

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オンにしても、他のモジュールで定義された関数への引数を評価しません。それはそれを非モジュール化するでしょう。

ここに先行技術はありますか?

4

1 に答える 1

5

私が理解している限り、反駁可能なパターンは、少なくとも外側のレベルでは常に厳格です。これは、精査された式が WHNF に評価されている必要があると言う別の言い方です。

したがって、あなたの

!(Just y) -> ...

表記は役に立たないようです。

OTOH、厳密な言語では、への引数Justはすでに評価されている必要があるため、表記法

Just !y ->

も意味がありません。

于 2013-11-06T13:54:25.917 に答える