"関数lv: cfg -> (blabel -> ide set)
を作成します。この関数は、指定された制御フローグラフ上のライブ変数分析を計算します。OCaml - 関数を出力として作成するにはどうしたらいいですか?
cfg
とblabel
を定義し、ide set
を文字列のリストとして使用すると、その署名でどのように関数を作成できますか?
"関数lv: cfg -> (blabel -> ide set)
を作成します。この関数は、指定された制御フローグラフ上のライブ変数分析を計算します。OCaml - 関数を出力として作成するにはどうしたらいいですか?
cfg
とblabel
を定義し、ide set
を文字列のリストとして使用すると、その署名でどのように関数を作成できますか?
あなたは、関数を定義するlet
の構文を使用して、おそらく精通している:
let f x = x + 1 in …
あなたは関数本体を含め、どこにでもこの構文を使用することができます。外部関数の戻り値として内部関数の名前を使用した場合、外部関数は関数を返します。
let outer_function x =
let inner_function y = x + y in
inner_function
let
構文は、fun
またはfunction
のため、実際のシンタックスシュガーです。特に、一度だけ名前を使用するようにinner_function
を定義した場合は、fun
という表記法を使用し、内部関数に名前を付けることはありません。すべての外側の関数は、あなたがそれを通過しないとき場合
let outer_function x =
fun y -> x + y
さらに、引数を指定すると、その関数に二つの引数を渡すとき、その動作を検討した後、内部の機能を構築して返すことです。最初に、外部関数は、最初の(そして唯一の)引数を使用して内部関数を構築します。その内部関数が第2引数に適用され、その本体が実行されます。これは、2つの引数をとる関数が1つしかないのと同じです。この の観察はcurryingとして知られています。
let outer_function x y = x + y
この関数の種類がint -> int -> int
であることに注意してください。 int -> (int -> int)
と同じタイプです(矢印タイプの演算子は右結合型です)。
内側の関数を構築する前に、外側の関数が何らかの作業をしている場合、カールは適用されません。その場合、最初の引数を受け取った後に作業が実行されます。
let outer_function x =
print_endline "outer";
fun y -> print_endline "inner"; x + y
だからあなたのコードの構造は次のようになりそうです:
let lv (c : cfg) : blabel -> ide set =
let c' = do_some_precomputation c in
fun (bl : blabel) -> (… : ide set)
完璧、ありがとう:) – genesisxyz
ちょうどその署名とその署名や機能を持つ関数と説明した意味論? '' f(x:cfg)(y:blabel):ide set = [] ' – sepp2k
そのシグネチャを持つ関数...あなたが書いた関数は、異なるシグネチャを持っています:cfg - > blabel - > ide set( '(' ')'なし) – genesisxyz
@genesisxyzこれはまったく同じタイプです。 ' - >'は右結合である。 OCamlのトップレベルは、括弧が冗長であり、タイプを印刷するときに最上位レベルが括弧を冗長に残すので、 'foo - >(bar - > baz) '型を持つ関数を決して表示しません。 – sepp2k