F# 地图故障
我在摸索F#的地图课时遇到了困难。我创建了一个简单朴素的lambda演算求值函数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
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