OCamlを始めてみるシリーズその2。
前回 VSCode でいい感じに書けるようになった(ハズ)ので, 早速 プログラミング in OCaml をちょっと進めてとりあえず3章の最初の練習問題までやってみた。
ここには途中で自分が気になった点とか練習問題の解答などを書いてみる。
ocamlformatについて
succ 0;;
succ 1;;
上記のコードはデフォルトだと以下のようにフォーマットされるのだが, 最初この挙動が理解できずにフォーマットがうまくできていないのかと思ってちょっと焦った。
;;
succ 0
;;
succ 1
結論から言うと, これはちゃんとフォーマットできている。(ハズ)
OCaml では JS で言うところの文末のセミコロン省略スタイルがスタンダードなスタイルらしい。基本的に ;;
は省略するのがデフォっぽい。
JS では JavaScript Standard Style 等の No semicolons 系スタイルだと, 以下のように最低限必要な場面のみ文の先頭にセミコロンを付けるが, 上記のフォーマットはそれのようなものだと理解した。(たぶん)
;[1, 2, 3].map(fn)
ocamlformat はどちらかというと opinionated なフォーマッター らしい。余計なことを考えずに済むのはありがたいので, このまま大人しくデフォルトのスタイルに従って書いていこうと思う。
追記: オプションがかなりたくさんあって割と自由にカスタマイズできた。オプションをいちいち調べなくて良いように .ocamlformat
ファイルの自動補完(VSCode拡張)を作ったのでひっそりと宣伝しておく。
練習問題3の所感
アルファベットの小文字なら大文字に, みたいなよくある問題があった。便利な関数とかあるのかもしれないがとりあえず愚直に int_of_char
で整数として扱うやり方でやった。これが想定解なのかどうかはわからない。
練習問題3.1の解答
自分の解答とかを貼っておく。(想定解かどうかはわからない)
let rate = 114.32
let round x = floor (x +. 0.5)
let d_to_y d =
let y_raw = round (d *. rate) in
int_of_float y_raw
;;
d_to_y 1.6
let y_to_d y = round (float_of_int y /. rate)
;;
y_to_d 228
let describe_d_to_y d =
let y = d_to_y d in
string_of_float d ^ " dollars are " ^ string_of_int y ^ " yen."
;;
describe_d_to_y 1.
let capitalize c =
let char_a_int = int_of_char 'a'
and char_z_int = int_of_char 'z'
and char_A_int = int_of_char 'A' in
let c_int = int_of_char c in
if c_int >= char_a_int && c_int <= char_z_int then
char_of_int (c_int - char_a_int + char_A_int)
else c
;;
capitalize 'g'
その他
OCaml の練習用のリポジトリを作った。 文法の練習とか試しに書いたものをここに上げていこうと思う。
オワリ