どのようにしてF#でベータリダクション機能を実装するのでしょうか?
-
27-09-2019 - |
質問
私はF#でラムダ計算を書いていますが、私はベータ削減(実パラメータと仮パラメータを代入)を実現する上で立ち往生しています。
(lambda x.e)f
--> e[f/x]
使用例
(lambda n. n*2+3) 7
--> (n*2+3)[7/n]
--> 7*2+3
私は他の人がこのことについてどのように行くかもしれないとの点でいくつかの提案を聞いてみたいので。任意のアイデアをいただければ幸いです。
ありがとうございます。
解決
タグのような式のルックスのあなたの表現を仮定すると、
type expression = App of expression * expression
| Lambda of ident * expression
(* ... *)
、あなたはsubst (x:ident) (e1:expression) (e2:expression) : expression
にx
でe1
のすべての自由な出現を置き換える機能e2
を持っている、とあなたは、通常の順序評価をしたい、あなたのコードは次のようになります。
let rec eval exp =
match exp with
(* ... *)
| App (f, arg) -> match eval f with Lambda (x,e) -> eval (subst x arg e)
次のように subst
機能が動作するはずます:
関数適用のためには、両方の部分式に自分自身を再帰的に呼び出す必要があります。
ラムダのために、それはあなただけで、ラムダは、識別子缶ためで残すことができ、その場合には、のラムダの引数名は識別子と同じでない限り、あなたは(置き換えたいラムダの身体表現、の上で自分自身を呼び出す必要があります「T)はその中の任意の場所で自由に表示されます。
変数のためには、いずれかの変数の名前は識別子と等しいかどうかに応じて可変不変または交換式を返す必要があります。
所属していません StackOverflow