OCaml 4.0が出てました

もう梅雨明けでいいんじゃないか、というくらい暑いですね。34℃とかやってらんねぇです。

まー暑いのは人間にはどうしようもないので置いておきます。

さて、去る7/26に、OCaml 4.0が公開されていました。公式HPからダウンロードできます。しかしこれに気付いた状況が、Mapモジュールのシグネチャがどんな風に実装されているかを見たくてinriaに行ったら出てたとか、言えねぇ・・・。それが仕事中だったとかもっと言えねぇ。

それはおいておいて、現行の3.12.1から何が変わったのか、公式HPから抜き出してみます。

  • The name of our favorite language is now offically "OCaml", and this name is used consistently in all the documentation and tool outputs.
    • "Objective Caml"から、"OCaml"に正式に名前が変わったみたいです。今迄ツールとかの出力に"Objective Caml"と出ていたのも、すべて"OCaml"になっているようです。
  • Generalized Algebraic Data Types (GADTs): this is a powerful extension of the type system that provides great flexibility and power to the programmer.
    • GADTs(一般化代数データ型)が利用可能になったようです。
    • 「高い柔軟性と力をプログラマに提供する型システムの拡張です」みたいな感じらしいです。すみませんどんなものかよーわかってません。
  • A new and improved ARM back-end.
    • ARM back endが新しくかつ効率的になったようです。ARMでOCaml使う人っているんだろうか。
  • Changes to first-class modules: type annotations can now be omitted when packing and unpacking modules (and are inferred from context whenever possible), and first-class modules can now be unpacked by pattern-matching.
    • 一級モジュールに変更が入ったようです。packing/unpackingする時に型注釈を省略することができるようになり、パターンマッチングの際に一級モジュールをunpackできるようになったらしいです。
    • 一級モジュール使ったことありませんのでさっぱりわかりません…。
  • Support for randomized hashtables to avoid denial-of-service vulnerabilities.
    • randomized hashtablesにサービス妨害攻撃の脆弱性回避対応が入ったようです
  • Installation of the compiler's internal libraries in +compiler-libs for easier access by third-party programming tools.
    • +compiler-libsフラグを付けると、サードパーティ製のツールからコンパイラの内部ライブラリへのアクセスが簡単に行なえるそうです。
    • 私ではそもそも利用状況が思いつかないあたりがなんともはや。

この内、言語機能に対する変更としては、GADTsと一級モジュールに対する変更のようです。

さて、個人的に気になったのはGADTsってなんじゃいという点です。ちょうどいいので個人的なメモも残しておきます。

GADTsとは?

えーと、この辺の理論とかは完全に私の脳の処理能力を超えてしまっているので、理解がほとんどできませんが、とりあえずはここが参考になるようです。

で、結局どういうものかというのを私がなんとか解釈したところ、

  • 普通にヴァリアントを利用すると、コンストラクタはその型に定義された型変数しか利用できない
    • なので、型変数が'aしかないコンストラクタの中で'bを使いたければ、普通は余分な型変数'bを宣言に追加するしかない?
  • そこで、それぞれのコンストラクタを関数と同じように宣言させることで、それぞれのコンストラクタをより一般的な形にすることができる
    • ここでの一般的→一般化というのは、型宣言の型変数のみに特殊化されたコンストラクタを、より一般的に利用できるようにすること?なのか?

・・・というもののようです。相変わらずOCaml力が低くてどういう場合に利用したいのかが今一、いや今三くらい思い浮かびませんが、利用することの効果としては

  • 不変量を減らす
    • この不変量がさっぱりですが、多分数学の不変量(invariant)のことで、

不変量(ふへんりょう、invariant)とは、数学的対象を特徴付ける別種の数学的対象のことである。一般に、不変量は数や多項式など、不変量同士の同型性判定がもとの対象の同型性判定より簡単であるものをとる。良い不変量とは、簡単に計算でき、かつなるべく強い同型性判別能力をもつものである。
・・・ということらしいです。このページによるとどうも圏論の話のようで、いかんせん数学の最終学歴が数3Cの人間にはちと辛いです。

    • ざっくりとした理解(と呼べるかどうか置いておいて)としては、同じ型と判別できる→型変数をより特殊化できる、という感じなんでしょうか・・・例とかを見るとそんな雰囲気が。
  • 存在型を隠す
    • 型パラメータを型宣言に含める必要が無い、という感じで、上で書いたこととほぼ同様のようです。

つまり言語機能としては、コンストラクタの意味により合うように=型としてより正しくなるように、それぞれのコンストラクタの型注釈を関数のようにすることができる・・・という感じなのでしょうか。うーむ、実際に使ってみないとさっぱり&使ってみてもよくわからない予感・・・。

こういうさっぱりわからないものが出る度、勉強不足を痛感させられますねー。Curlの勉強とかよりもこういうのを理解できるように頭を鍛える方が大事じゃまいかとか思わなくもない。

まとめ

OCaml4.0が出たのでヒトバシラーな方は是非使ってみてください。私はまず一級モジュールとかの勉強から・・・。