let と in が多くて、見た感じややこしい。 |
C言語と変数の扱いがだいぶ異なり、なかなか慣れない。またif文等でCだと if(〜)となっていたのが、括弧をつけないのが通例というのが、ソースを読む 上でなかなか読みづらいです。他に引数チェックなどの処理の際、if文の型の 制約から、エラーを知らせるのを文書で出来ないのは、非常に違和感がありま す。 |
そうですね,文法が慣れた言語からかなり離れているので違和感を覚える人は 少なくないようです.Objective Caml (多くの関数型言語)では, 複雑な入れ子になった式を書くことがおおく,括弧の使用頻度が多いようです. ので,if などの構文が括弧を必要とすると余計に括弧が増えて見にくくなる, という人もいます.(プログラムを英語の文章っぽく読める,という点では Objective Caml の方が読みやすいかな,という気もします :-) また,不正な引数のチェックがしにくいということですが,もう少しすると, 例外を自分で発生させることができます.(0 での除算のように引数が不正な 場合をチェックして,計算を値を返さずに異常終了させることができます.) |
…ループを使わず再帰的呼び出しで処理するのは単純 に考えると効率は悪いが、そのように設計された言語なのだろうか。 |
再帰呼出しでも効率よく実行する工夫はいくつかされています.
例えば,以下のような最適化(一般に末尾再帰の除去と呼ばれます)を行っています.
C言語の関数呼出し f(x,y) は,機械語レベルでは,
let f x = if x then g 1 else 1 + g 2;; (f true) + 1のようなものを考えます.then 節の g の呼出しが末尾呼出しです. この場合,(f true) +1 の実行は以下のようになります.
|
Objective Caml 入門 テキスト P.50 4.2.3中で
> fun x -> -. (sqrt x) > は, > # let f = o sqrt ( -. );; > val f : float -> float -> float = <fun> > # f 2.0;; > - : float -> float = <fun>という箇所がありますが(授業中に先生はおかしいと言っておられましたが)、 マニュアルを見たところ、負の数を表す正確な記述として "~-." という記号が ありました。これを用いたところ、 # let f = o (sqrt) (~-.);; val f : float -> float = <fun> # f 2.0;; - : float = -1.41421356237となったので、恐らく負の数の記号が間違っているのではないかと思います。 |
その通りです m(__)m 指摘ありがとう. |