l_n_m’s diary

よわい電気系の日記(本当にただの日記)

OCamlに触れる

OCaml on JUPYTER

いろいろなプログラミング言語を見てみるという大学の講義で、今回OCamlをやりました。
関数型言語に触れるのは初めてで、最初はどう書けばいいのか正直分かりませんでした。でも簡単なものは書けるようになったので復習がてら。

let x = 1;;
let f p = p mod 2 = 0;;

基本の定義。変数が値を持つのは当然ですが、関数も必ず値を返すというのがなかなか慣れません。
CとかJSとかの関数はいくつかの処理を並べたものであって、それぞれの処理の値を返そうとするものではないですよね、
for文なんかはその最たるものかなと思います。ついCならああ書くのになぁ、なんて考えてしまって。
でも変数も関数も同じように扱えるというのはかっこいい、というか凄い。

let l = [1; 5; 8; 2; 13];;
let rec evens l = match l with
  [] -> []
  | h::t -> if h mod 2 = 0 then h :: evens t
    else evens t;;

リストと関数の再帰的定義、パターンマッチング。
確かにその書き方ならそうなるね、と言われれば分かりますけど、関数型言語初心者にこれを思いつけと言うのは酷かも。
headとtailの扱い方を一度出来てしまえば大丈夫ですが、前から順にやっていくのは新しいというか。
括弧の付け方とか変数の数とかきっちりしているのはいいですね。関数型言語に限らずかもしれませんけど。日本語とかの方がよっぽど雑。
文学科の友人に言わせれば、日本語よりロシア語の方が格によって厳密な意味が定まる、というのと重ね合わせるかも。

型推論

関数型言語の一番凄いところでは!
いろいろ厳密な関数型言語なのに、型は殆ど気にせず書ける。頭の中にある関数の意味をそのまま書き出せば、そこで使う変数やら引数は勝手に推測してくれる。
なんと便利なことでしょう!! JSのような型の無い言語でも似た話は出来ますが、あっちは意図していない型の変数でも受け取ってしまうのが欠点。むしろそれらの、例えばstringを期待しているときにintが投げられたときの処理をいちいち書くのが面倒くさい。だからこそTypeScriptとかが生まれたわけですが。
C++ならautoが全てに書かれているようなもの。しかも関数は全てtemplate。
もっと真面目に書けと怒られそうなレベルの話ですが、これが関数型言語のデフォ……理想郷か……?
もっと使いこなせるようになったら、関数型言語マニアに目覚めるかもしれません。目覚めないかもしれませんけど。

課題

今週末までにやらなくちゃいけない課題として、

が与えられました。ぼちぼち手をつけなきゃ。
実はアルゴリズムの講義を受けていないのでいろいろ知識が雑(クイックソートって言われて一瞬戸惑ってしまったレベル)。
基本用語ですし、そういう手法もおさらい(勉強?)しなきゃいけないかなぁ……。
それじゃ、今週も頑張ろう。うん。