F# でインタープリターを作成しています。私は賢く、プリミティブ演算子の解釈を関数呼び出し (この場合はリダクション) として一般化しようとしています。
これがアイデアです:
let reduce fx values =
Array.reduce values fx
let primitivesEnv =
let r = Dictionary<string,'T -> 'T -> 'T>()
r.["int_+"] <- reduce (fun(l:int, r:int) -> l + r)
r.["int_-"] <- reduce (fun(l:int, r:int) -> l - r)
r
だから私は後でこれを行うことができます:
env.["int_+"]([| 1, 2 |])
もちろん、型チェッカーはこれを拒否します
警告 FS0064: この構成により、コードは型注釈で示されるよりも一般的ではなくなります。型変数 'T は型 ''a -> 'a -> 'a' になるように制約されています。エラー FS0001: タイプが一致しません。a ('a -> 'a -> 'a) -> ('a -> 'a -> 'a) -> 'a -> 'a -> 'a を期待しているが、a ('a -> 'a -> 'a) -> 'a ''a' と '('a -> 'a -> 'a) -> 'a -> 'a -> 'a' を統合すると、結果の型は無限になります。
PD: 単純なインタープリターとしてこれを行う方法は知っていますが、それぞれに MATCH を作成することなく、汎用的な方法で数十のメソッドを構築できるソリューションを構築しようとしています。