0

-caml-light の単項演算子と二項演算子の違いで遊んでいます。

let a b = 
print_int b;
  print_newline();
;;


let c d e  = 
print_int d;
  print_newline();
print_int e;
  print_newline();
;;

a (3 - 4 ) ;
c (9 - 4 )
;;

コードがエラーをスローするか (a または c の引数の数について混乱するため)、次のように出力することを期待しています。

-1
5

ただし、問題なくコンパイルされ (以下のコンパイラ バージョン)、-1 が出力されます。

最後の呼び出しで何が起こるか誰か教えてもらえますか?

Cobrakai$camlc -v
The Caml Light system, version 0.80
  (standard library from /usr/local/lib/caml-light)
The Caml Light runtime system, version 0.80
The Caml Light compiler, version 0.80
The Caml Light linker, version 0.80
Cobrakai$
4

1 に答える 1

4

ML では、すべての関数が厳密に 1 つの引数を取ります。一見マルチパラメータ関数は、実際には 1 つの引数を取り、残りの引数を取る別の関数を返す関数です。

シンlet c d e = ...タックス シュガーも同様です。let c = function d -> function e -> ...

の型は でcありint -> int -> unit->右結合なので、 ですint -> (int -> unit)intしたがって、関数を受け取って返す関数であることがはっきりとわかります。

のように複数の引数に適用するとc 1 2、関数適用は左結合なので実際にはであるため、 が関数に評価され、それが に適用される(c 1) 2ことがわかります。c 12

したがって、「引数が少なすぎる」関数を指定すると、結果は関数になります。これは、"部分適用"と呼ばれる ML の便利で一般的な手法で、関数の最初のいくつかの引数を便利な方法で "修正" できます。

入力した式が関数に評価されるときに、Caml Light インタープリターがそれをどのように処理するかはわかりません。しかし、あなたが言っていることから、何も印刷されていないようです。

于 2013-03-17T19:48:14.527 に答える