2012-01-18 4 views
1

"関数lv: cfg -> (blabel -> ide set)を作成します。この関数は、指定された制御フローグラフ上のライブ変数分析を計算します。OCaml - 関数を出力として作成するにはどうしたらいいですか?

cfgblabelを定義し、ide setを文字列のリストとして使用すると、その署名でどのように関数を作成できますか?

+1

ちょうどその署名とその署名や機能を持つ関数と説明した意味論? '' f(x:cfg)(y:blabel):ide set = [] ' – sepp2k

+0

そのシグネチャを持つ関数...あなたが書いた関数は、異なるシグネチャを持っています:cfg - > blabel - > ide set( '(' ')'なし) – genesisxyz

+4

@genesisxyzこれはまったく同じタイプです。 ' - >'は右結合である。 OCamlのトップレベルは、括弧が冗長であり、タイプを印刷するときに最上位レベルが括弧を冗長に残すので、 'foo - >(bar - > baz) '型を持つ関数を決して表示しません。 – sepp2k

答えて

5

あなたは、関数を定義する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) 
+0

完璧、ありがとう:) – genesisxyz

関連する問題