7

Haskellで次のような関数を定義する方法はありますか?

or True      True      = True
or True      undefined = True
or True      False     = True
or undefined True      = True
or undefined False     = undefined
or undefined undefined = undefined
or False     True      = True
or False     undefined = undefined
or False     False     = False

私は現在、そのユースケースを持っていません (興味はありますが)、可能であれば興味があります。

4

2 に答える 2

15

これは標準の Haskell では不可能ですが、Conal Elliott によってlubライブラリに実装された安全でないトリックで実行できます。

基本的に、次の 2 つの関数を記述します。

orL True _ = True
orL False x = x

orR = flip orL

そして、or a bと のlub(「定義された」順序に関する最小の上限) とorL a b定義することができますorR a b

操作上、両方の計算を並行して実行し、成功した最初の計算を選択して、もう一方を強制終了します。

提案どおりに機能しますが、重大な欠点があります。まず第一に、lubその引数が一致する場合にのみ安全です (底でない限り等しい)。を取るlub True Falseと、結果は非決定論的になり、純度に違反します! 第 2 に、両方の計算を並行して実行することによるパフォーマンス オーバーヘッドは、いくつかの条件で支配的になる可能性があります (foldr or Falseたとえば、大きなリストの a を計算してみてください!)。

于 2012-06-08T15:36:57.747 に答える
12

評価順序 (値を検査する順序) に応じて、遅延バージョンを作成できます。

Prelude> True || undefined
True
Prelude> undefined || True
*** Exception: Prelude.undefined

Prelude> :t or
or :: [Bool] -> Bool

Prelude> or [True, undefined]
True

実際、Haskell は遅延言語であるため、Haskell のデフォルト定義はこのように動作します。

ただし、最初に値を確認せずに未定義の値を「スキップ」する方法はありません。これにより、値が最下位に評価され、式が未定義になります。

遅延値にはゴーストが含まれていることに注意してください。

ここに画像の説明を入力

箱の中を見ると、幽霊があなたを捕まえるかもしれません。

ボトムのチェックが重要な場合 (たとえば、テスト スイートの一部として)、それらを例外として扱い、インターセプトすることができます。しかし、純粋な関数ではそれを行いません。

于 2012-06-08T15:06:25.177 に答える