我正在用 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' 时,结果类型将是无限的
PD:作为一个简单的解释器,我知道如何做到这一点,但我试图构建一个解决方案,让我以通用的方式构建数十种方法,而无需为每个方法制作 MATCH。