OCaml Language Sucks
http://www.podval.org/~sds/ocaml-sucks.html
せっかく勉強しはじめたのにショッキングな記事。
たしかに、型を自動でキャストしてくれないとかは不便と思うけど。
# 2.0 ** 10.0;;
- : float = 1024.
# 2.0 ** 10;;
This expression has type int but is here used with type float
これぐらいは容赦してよと思う。
# #load "nums.cma";;
# open Num;;
# string_of_num (power_num (num_of_int 2) (num_of_int 10000));;
- : string =
"1995063116880758384883742162683585083823496831886192454852008949852943883022
19466319199616840361945978993311294232091242715564913494137811175937859320963
23957855730046793794526765246551266059895520550086918193311542508608460618104
68550907486608962488809048989483800925394163325785......略"
↑こういうのもPythonなら
>>> 2 ** 10000
1995063116880758384883742162683585083823496831886192454852008949852943883022
19466319199616840361945978993311294232091242715564913494137811175937859320963
23957855730046793794526765246551266059895520550086918193311542508608460618104
68550907486608962488809048989483800925394163325785......
で済んでしまうしなあ。
いや、しかしこれは逆にPythonが常に無条件にOCamlのbig_int相当を使っているからできているにすぎないということか。
ネイティブコードでの実行パフォーマンスを考えるとこういう込み入った仕様もやむなしか。
また、冒頭の記事にもあるように大きいintが桁あふれしてもなにも言わずに変な値になるというのも、ちょっとこわい。
速度重視の実装だから、やはり半分はC言語感覚で使えということだろうか。
いつもC++で書いてる時は、その場合場合に合わせて
「この変数はまあこの用途だから、unsigned intでいいよね、こっちはssize_tかなあ」
と想像しながら書くから問題はないんだけど。
OCamlをマスターするころにはこういうものはスッキリしてるんだろうか。