2011-12-12 18 views
5

「%identity」のような関数が必要なのはなぜですか?let a = aと同じです。それを使用してパフォーマンスを向上させる予定ですか?ocaml%同一性関数

"%identity"がオーバーヘッドを少しでも減らすことができるならば、私は自分のプログラムでファントムの型を導入し、型を変換するために何回もID関数を呼び出すでしょう。

答えて

10

%identity機能は実装の一部であり、OCaml言語の一部ではありません。これはコンパイラに(本質的に)関数のパラメータを戻り値に変更することは何もないことを伝えます。言い換えれば、同じ値を使用し続け、型の考え方を変更するようにコンパイラに指示します。誤って使用すると、OCaml型システムの優れた安全性の保証がすべて無効になります。また、言語の他の実装(INRIAコンパイラの将来のリリースを含む)で動作することは保証されていません。

OCamlコンパイラのインライン展開機能は、アイデンティティ関数に対してコードが生成されないことを、すでに保証しているはずです。だから私はあなたがそれらを使い続けていることをお勧めします。

let (<<) f g x = f (g x) 
let id x = x 

が続いてここでの要素を追加するための機能です。

更新

コメントに関係のない質問に答えるために....あなたは関数合成とアイデンティティ機能を持っていると仮定リストの要素を乗算し、リスト内のすべての関数を構成します。

例S:

# sum [2; 3; 5; 7];; 
- : int = 17 
# product [2; 4; 17];; 
- : int = 136 
# let mx = composition [(+) 1; (*) 10];; 
val mx : int -> int = <fun> 
# mx 2;; 
- : int = 21 

点は0関数組成物用添加のID、乗算のための1、およびidであることです。 idは常に0と1のように便利です。

+0

いつも 'identity'関数('%identity'は必ずしもそうであるとは限りません)を使うのですか? –

+0

これは、数字0と1を使うときに尋ねるのと似ています。関数がファーストクラスの値である言語では、アイデンティティ関数は非常に便利です。 –

+0

申し訳ありませんが、私の質問は、あなたが私に '' f x = x'を使わなければならない、あるいは使わなければならないという有用な事例を与えてくれるようなはずですか? –

1

外部プリミティブとして%identityを使用すると、適用されるたびに(fun x -> x)クロージャの評価に伴うオーバーヘッドが削減されます。

OCamlは特殊なケース%プリミティブのコンパイラ:bytecomp/translcore.ml関連付け各内蔵ASTノード(%identityの場合には、それがPidentityにマッピングされる)特別のものを。コンパイラーはノード上で一致し、それが適用される式を単純化します。ネイティブコンパイラの場合には、関連する行は、次のとおり

  • asmcomp/closure.ml線197とSS:%identity引数自体に一定の引数に適用される単純化:

    begin match p with 
        Pidentity -> make_const_int x 
    | Pnegint -> make_const_int (-x) 
    
  • asmcomp/cmmgen.mlライン1047引数:を直接評価するためにアプリケーションのLHSとして%identityを簡略化します。

    match p with 
        (* Generic operations *) 
        Pidentity -> 
         transl arg 
    

バイトコードコンパイラには、プリミティブと同様の簡略化規則があります。