どのようにしてF#でベータリダクション機能を実装するのでしょうか?

StackOverflow https://stackoverflow.com/questions/4039494

  •  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) : expressionxe1のすべての自由な出現を置き換える機能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)はその中の任意の場所で自由に表示されます。

変数のためには、いずれかの変数の名前は識別子と等しいかどうかに応じて可変不変または交換式を返す必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top