0

そのように始まる関数から次の行を抽出しました (教科書の例は不完全です):

    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 構造体に「安全に」入力します...ここの演算子が実際に何をしているのか気になりますか? また、上記の行を構造化するためのより直感的な方法があれば?

4

2 に答える 2

2

入力すると

(<|||);;

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 バインディングを作成する
  • 再利用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)
于 2013-10-10T15:56:53.633 に答える
1

演算子は<|||、右側の引数 (タプルとして提供) を左側の関数に渡すだけなので、この行は次のように意味します。

k (safeInput (safeInput sub a (Var b)) b (Var a))

または、読みやすくするために行を 2 つに分割する場合は、次のようにします。

let sub' = safeInput sub a (Var b)
k (safeInput sub' b (Var a))

これを使用している本は知りませんが、変数「a」から変数「b」へのマッピングと、変数「b」から変数「a」への別のマッピングを追加するという考えだと思います。

于 2013-10-10T15:56:02.587 に答える