1

short :: Val -> Exp -> Error ValHaskell インタープリターという名前で呼び出しを作成しており、式に適用された値を評価する関数を実装したいと考えています。短絡ブール二項演算子の 2 番目の引数 (つまり((&&) False)and 、またはユニット ラムダ ( ) 抽象化((||) True))に渡される引数) を評価したくありません。\() -> ...

Haskell などの怠惰な言語では、Prelude に組み込まれた短絡ブール二項演算子が得られることを私は知っています。私は次のようなことができると考えていました:

short :: Val -> Exp -> Error Val
short (Partial (&&) False) = False
-- Making use of Partial Oper Val that is defined in Val

しかし、型エラーが発生することはすでにわかっています。正確に何をすべきかわかりません。助言がありますか?

追加の定義:

data Val = VUnit | VNil
         | VN Int | VB Bool | VOp Oper
         | Partial Oper Val
         | VLamUnit Exp (Env Val)
         | VLam String Exp (Env Val)
         | VListBool [Bool]
         | VListInt [Int]

data Exp = Unit | Nil
         | N Int | B Bool | Var String | Op Oper
         | App Exp Exp
         | LamUnit Exp
         | Lam String Exp
         | If Exp Exp Exp
         | Let [(String, Exp)] Exp

data Error a = S a
             | Error String
4

1 に答える 1

4

関数の引数の評価は、引数をバインドするために使用されるパターンによって最初に決定されます。

あなたが持っている場合

short :: Val -> Exp -> Error Val
short val ex
   | condition on val only       = something
   | other condition on val only = somethingElse
   | condition involving ex too  = thirdPossibility
   | otherwise                   = whatever

valパターンは反駁できない変数パターンであり、最初のガードの結果を決定するために部分的または完全に評価されるため、引数のバインドでは評価は行われません。それが に評価される場合、 で使用され、その評価が を評価する必要がある場合Trueにのみ評価されます。最初の 2 つの条件が と評価された場合にのみ、が評価されて 3 番目のガードの値が決定されます (そうでない場合もあります)。expsomethingsomethingFalseex

のコンストラクターに基づいてショートカットvalできる場合は、反駁可能なパターン for を使用できval、変数パターン (単なる識別子) を使用できます。forなどexと同じ短絡が得られます。(&&)

short (Val foo) ex = Okay (foo bar ex)
short (Lav oof) _  = Okay oof
short val ex
  | isGood val = oomph
  | isBad ex   = error "Didn't expect that"
  | otherwise  = undefined

Exp右側の引数を使用しない場合は、名前を付ける必要さえありません。ワイルドカード_は、「無視される引数はここにあります」と言います。

あなたの望ましい行動のために

short :: Val -> Exp -> Error Val
short (Partial (&&) False) = False

Falseは aBoolであり、 ではないため、それ自体は機能しませんVal。使用できます

short (Partial OR (VB False)) _ = S False

の仮想コンストラクターORを使用しOperます。(そこで使うことはできます(&&)が、それは何にでもマッチする可変パターンです。) そのパターンはExp引数をバインドすることさえしないので、その評価が の以前の方程式によって強制されない限り、評価されないshortままです。

于 2012-12-03T06:19:19.753 に答える