F# 地图故障

F# 地图故障,f#,F#,我在摸索F#的地图课时遇到了困难。我创建了一个简单朴素的lambda演算求值函数 type Name = string type Term = | Var of Name | Lit of int | App of Term * Term | Lam of Name * Term let rec lookup(v, e) = match e with | (v1, t)::tl -> if v1 = v

我在摸索F#的地图课时遇到了困难。我创建了一个简单朴素的lambda演算求值函数

type Name = string
type Term =
    |   Var of Name 
    |   Lit of int
    |   App of Term * Term
    |   Lam of Name * Term

let rec lookup(v, e) =
    match e with
    |   (v1, t)::tl         -> if v1 = v then t else lookup(v, tl)
    |   []                  -> failwith "unknown variable %s" v

let rec eval(x, e) = 
    match x with
    |   Var x               -> lookup(x, e)
    |   Lit x               -> Lit x
    |   App (Lam(v, f), t2) -> eval(f, ((v, t2)::e))
    |   _                   -> failwith "Invalid"
最明显的优化是将列表更改为地图,因此我提出

let rec eval2(x, e: Map<Name,Term>) =
    match x with
    |   Var v               -> e.[v]
    |   Lit l               -> x
    |   App (Lam (v, f), t) -> eval2(f, e.Add(v, t))
    |   _                   -> failwith "Invalid term"
为什么,

let x = eval(prog, [])
但是,

let x2 = eval2(prog, Map [])

抛出键未找到异常?

我不重新执行此行为(使用F#1.9.6.2,它对我有效):

#灯
类型名称=字符串
类型术语=
|名称变量
|整型照明
|学期申请表*学期申请表
|姓名*术语的林
let rec eval2(x,e:Map)=
将x与
|变量v->e[v]
|灯光l->x
|应用程序(Lam(v,f,t)->eval2(f,e.Add(v,t))
|带有“无效术语”的故障
设ident=Lam(“x”,Var“x”)
让程序=应用程序(识别,灯3)
设x2=eval2(prog,Map[])
printfn“%A”x2//3

Hmm。现在,在关闭和重新打开VS之后,我也无法复制它。
let x2 = eval2(prog, Map [])
#light

type Name = string
type Term =
    |   Var of Name
    |   Lit of int
    |   App of Term * Term
    |   Lam of Name * Term

let rec eval2(x, e: Map<Name,Term>) =
    match x with
    |   Var v               -> e.[v]
    |   Lit l               -> x
    |   App (Lam (v, f), t) -> eval2(f, e.Add(v, t))
    |   _                   -> failwith "Invalid term"

let ident = Lam ("x", Var "x")
let prog = App (ident, Lit 3)
let x2 = eval2(prog, Map [])
printfn "%A" x2   // Lit 3