繁体   English   中英

F#期权声明分析

[英]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))

要改善功能,您还可以:

  • 创建let绑定以保存立即值
  • 重用exp1exp2而不是创建相同的值

例如

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM