[英]F# Analysis of Option Statement
我从这样开始的函数中提取了以下行(课本示例不完整):
let rec unify (exp1:exp) (exp2:exp) (k:(subst -> subst)) (sub:subst) =
match checkmap exp1 sub,checkmap exp2 sub with
| Var a,Var b when a = b -> k sub
| Var a,Var b -> k (safeInput<|||((safeInput<|||(sub,a,Var(b))),b,Var(a)))
线:
Var a,Var b -> k (safeInput<|||((safeInput<|||(sub,a,Var(b))),b,Var(a)))
safeInput引用“安全地”将类型输入到Map结构中……我只是想知道这里的操作员实际上在做什么? 另外,是否有更直观的方法来构造上述行?
如果您输入
(<|||);;
进入F#Interactive,您将获得其签名:
val it : (('a -> 'b -> 'c -> 'd) -> 'a * 'b * 'c -> 'd) = <fun:it@1>
它的定义就像
let inline (<|||) f (a, b, c) = f a b c
所以最后一个表达式可以改写为
k (safeInput (safeInput sub a (Var b)) b (Var a))
要改善功能,您还可以:
exp1
和exp2
而不是创建相同的值 例如
let rec unify (exp1 : exp) (exp2 : exp) (k : subst -> subst) (sub : subst) =
match checkmap exp1 sub,checkmap exp2 sub with
| Var a, Var b when a = b -> k sub
| Var a, Var b ->
let sub' = safeInput sub a exp2
k (safeInput sub' b exp1)
<|||
运算符只是将右边的参数(以元组形式提供)传递给左边的函数,因此该行的含义与以下内容相同:
k (safeInput (safeInput sub a (Var b)) b (Var a))
或者,如果您想将行分成两部分以提高可读性:
let sub' = safeInput sub a (Var b)
k (safeInput sub' b (Var a))
我不知道使用此书的人,但我想这个想法是要添加从变量“ a”到变量“ b”的映射,以及从变量“ b”到变量“ a”的另一种映射。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.