どうも、オンライン&リアルクレーンで負けが込んでる Reason 初心者です。ここ一ヶ月ほど Reason を使い込んでみた感想をまとめてみようと思います。軍資金ください。

現時点までの実装を次のリポジトリに置きました。参考になればどうぞ。

https://github.com/szktty/reasonml-webapp-prototype

なぜ使ってるのか

私は公私で OCaml を使っていまして (公では一時期しか使ってませんが一応) 、 OCaml と言えばやることは高速な構文解析か高速なコマンドラインツールです。 GUI は弱いしモバイルアプリは無理だしサーバーサイドはマルチコア非対応なので他に使い道がありません (※個人的な感想です) 。

そんな感じでフロントエンドに関わる機会がありませんでしたが、この度サーバーサイド込みでなんかやることになりました。ただ、社内向けに近いと言えなくもないし特急の仕事でもないので、ちょっと Reason を試験的に使ってみました。この記事を書いている時点でだいたい一ヶ月になります。

何に使ってるのか

Web サービスのプロトタイプ開発です。フロントエンドとサーバーサイドの両方やります。フロントエンドは ReasonReact で、どうせならとサーバーサイドに Express を使い、 ORM に Sequelize を使い、テンプレートエンジンに Pug を使い、すべて Reason で実装する方向で進めています。進めているというだけで、最後まで Reason でやりきるとは言ってません。

チームの人数は?

一人です。ただし継続的に携わるとは限らないので、もし Reason で運用するなら引き継ぎを考えなければなりません。

一ヶ月でどれくらい進んだ?

ごく単純なデータベースのモデルを定義できて Hello, world! レベルの Web ページを表示できるくらいです (詳しくはリポジトリをご覧下さい) 。つまり Django のクイックスタートに負けます。まじか

なぜ時間がかかってるのか?

Reason は OCaml の単なる文法スキンですので、私にとっては学習コストはほとんどありません。主な理由は次です。

  • フロントエンド初心者(昔やってましたがそのときのノウハウは古過ぎる)で、あらゆる面で慣れてません。今の JavaScript の言語仕様、 Promise 、ライブラリ、特にツールは何を使えばいいのか全然わかりませんでした。

  • 深刻なライブラリ不足。標準ライブラリは貧弱、既存の JavaScript のバインディングはゼロと言っていいです。あっても出来がいいとは言いにくいです。フロントエンドと OCaml の両方がわかる人は全然いないのかもしれません。だもんでひたすらバインディングを書いてます。 Express (一応既にありますが機能的に足りない) , Sequelize, あと標準ライブラリの強化 (と言うか代替) です。

メリットとデメリット

いいとこ:

  • 型安全の精神的健康性

  • OCaml のノウハウがそのまま使える

悪いとこ:

  • 強い型付けに伴う生きにくさ (人による)

  • OCaml のバッドノウハウがそのまま使える

    • ファンクターのわかりにくい文法に手をつけてなくない? (module Make = (Ord: OrderedType) : (S with type elt = Ord.t) => { ... } みたいなの)
  • 標準ライブラリどうすんの

  • バインディングはオブジェクトベースから関数ベースに落とし込む必要があり、人によって設計の結果が大きく異なる可能性があるのではないかと思います (使いにくいとか、型検査をすり抜ける動的な性質を残しているとか。しかしねえ、徹底的に型付けしようとするとファンクターを使わざるを得なくて複雑な API になってしまう) 。同一の JavaScript ライブラリに対して複数のバインディングが登場しやすいのではないかと思います。標準ライブラリも然りです。

他の言語と比べてどう?

強い型付けによるメリットとデメリットは主観的になりやすいと思います。 Reason だからこそできるとアピールできる機能はありません。別に速くはならないし、型なら TypeScript にもあります。むしろライブラリとユーザーが極端に少ない分相当不利です。

そんなんですから他の人に Reason を使わせるだけの説得力はあまりないと思います。「型嬉しいよ」と言っても動的型付け派には邪魔でしかないし、「複雑な型も表現可能だよ」と言っても TypeScript や Flow で十分間に合ってる派には不要でしょう。

現時点で Reason を使うには、ラーメン一杯のために小麦粉から作る根性がいると思います。

型に厳しい言語は変更に弱いんじゃないの?

個人的な体感ではそんなことはないと思います。変更に強い型は設計可能です(それが難しいんだけど)。動的型付け言語だからと言って無条件に変更に強いシステムになるわけじゃないでしょ?

「型を変更したらあちこち修正しないとコンパイルできない、実行できないじゃないか」と言われたらおっしゃる通りです。でも動的型付けだと変更前の古い型が潜伏する可能性がありますよね。型エラーはテストで検出できる?テストを書く時間が型の修正に回るだけだと思います。まあこんな感じで不毛な議論を繰り返せるのは、型のメリットとデメリットが「気分次第」になってしまうからでしょうね。個人的には適切に型を定義できれば仕事の七割は終わりくらいに思ってますがたいして仕事してないからでしょうか。

学習コストはどう?

ちょっと悲観的に考え過ぎかもしれませんが...かなり高いと考えて間違いないと思います。ドキュメントや参考書籍もろくにないし。強い型付けとなると、どんなに便利なライブラリを使おうにもまずは型を理解しなければコンパイルもできません。動的型付けの言語なら理解を後回しにしてとりあえず動かせます。

強い型付け&高階関数への強い抵抗を持つ人は (今に限らず) かなり多いように感じます。わずらわしいとか、面倒くさいとか、苦手とか、必要ないとか。そう言う人は強い型付けも高階関数も必要ないんです。バカにしてるわけじゃないですよ。人それぞれに得意なやり方があるってだけです。

どんな人に向いてる?

  • 型ベースの思考に慣れてる人
  • 型ベースの思考に憧れてる人
  • TypeScript では刺激が足りない人
  • レベルを上げて物理でオーバーキルしたい人

どんな人は向いてない?

  • 人生を型に縛られたくない人
  • TypeScript に満足している人
  • バインディングなんか作りたくない人
  • Facebook が嫌いな人

プロダクションで使えるのか

まだプロダクトができてないのでわかりません。 OCaml の機能がすべて使えるため、言語機能は問題ないと思います。

おそらくの問題は Reason 製のライブラリの品質でしょうか。 OCaml のライブラリも使えますけど、過剰な期待は禁物です。

結論

わかりません。興味がある人は触ってみればいいし、興味がない人はこの先も魅力を感じないと思います (バカにしてるわけではない) 。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.