あと味

たくさん情報を食べて、たくさん発信すると、あとになって味わい深い。

Reason(ML) で簡単な Android アプリを作ってみた

Reason は JSX をサポートしているので、React 関連バインディングが充実している。

bs-react-native という React Native のバインディングもあって、これを使って簡単な Android アプリを作ってみた。

github.com

作ったアプリは入力した英語の文章に含まれる各単語が、Ogden's Basic English の制限語彙の単語であるかどうかをバリデーションして、制限語彙外の単語が赤くハイライトされるもの。

Basic English とは、850単語ですべての事象を英語で説明できることを目的としたシステムで、英語が主言語ではない外国の人(日本人など)が、英語が主言語な人、またはそうでない人たちと、英語を介してコミュニケーションを取れるようにするために生まれたシステム。ただ、類似のシステムと比べて、Basic English は流行らずに化石化しているっぽい。日本語の書籍も大昔に出版されたものしかない。詳しくは前述の Basic English の公式サイトや、日本ベーシック・イングリッシュ協会 のコンテンツを参照されたし。

bs-react-native のはじめ方

下記のような流れでアプリを作る。特にハマりどころはなかった。

  1. create-react-native-app で素の React Native アプリ雛形を作る
  2. bs-react-native の README にあるとおり、bs-react-native 用の各種パッケージを追加する(独自パッチの当たった OCaml をビルドするので時間がかかる)
  3. bs-react-native で使用するコンフィグ (bs-config.json) や npm scripts コマンドを追加する
  4. 自動生成されたファイルを微調整する
  5. Reason ファイルを追加する
  6. ビルドしたり、ウォッチしたり、アプリ起動したり(react-native run-android

あとは、React Native のように Expo で動作確認しながら実装していく。

作ってみた感想

素の React Native を使ったことがなく、Android アプリも作ったことがないので、それらとは比較ができないが、基本的なパーツを使って、お作法通りの使い方をする分には非常に簡潔に実装できた。

現在サポートしているコンポーネントAPI は下記で参照できる。

サンプルが下記ぐらいしかないので、bs-react-nativeリポジトリと React Native のドキュメントを読みながらコードを書いた。

bs-react-native のベースのライブラリになる、reason-react 自体は下記の公式のドキュメントやサンプルがあり、他のリポジトリの実装もある。

Reason は OCaml の JSer フレンドリ AltJS なので、インターフェイスファイルを見て型を合わせていけば、大体動いてくれる感じがする。

Reason について

Reason 自体初めて書いた。直近に Real World OCaml を読んでいたこともあって、Reason 固有のシンタックスに少し戸惑ったが、ほぼ JS なので、すぐに慣れる。JS 書ける人ならすぐに書けるようになると思う。

でも JSX を使わないプロジェクトでは BuckleScript を使う気がする。

reason-cli でインストールされる各種エディタ支援機能が便利で、VSCode が推奨されているので、自分も VSCode を使った。

会社で Haskell 入門読書会に参加しているんだけど、Haskell はまだまだ難しくて、実戦で使えそうにない。OCaml は、Haskell よりシンタックスは冗長だけど、書きたければ全部手続き言語的に書けるし、正格だし、オブジェクトもあるしで、関数型言語的に書きたいし、静的型付けの恩恵も受けたければ、OCaml はコンフォートゾーンだと思う。型推論が超強力なので、型を書く必要もほとんどない。

さらに、Reason は JSer にとって学習コストが低めで、JS のワークフローや既存資産をフル活用できるので、実用的な何かを書く場合は、もしかしたら OCaml よりも便利かもしれない。

Elm は Haskell 風だけど、型クラスがなかったりして、OCaml っぽい冗長さがあるのと、JS との相互運用が Reason ほど楽ではなそうで、今となっては Reason と比較して中途半端に感じる部分がある。

Reason は Reason React で、The Elm Archtecture (Elm Archtecture の発明は偉大)を参考に作られた Redux 風のアーキテクチャでコードを書くので、JSX を使用するコードは結果的に Elm っぽくなる。

今のところは Elm の方が記事等を目にする機会が多いけど、バックに BloombergFacebook がいるという点も安心感があるので、自分は Reason に投資していこうと思う。

今年は初の言語単独のカンファレンスがオーストラリアで開催されることもあって、少しは盛り上がりを見せてくれるのではないかと期待している。

www.reason-conf.com

なお、ドキュメント翻訳の進捗は芳しくないです。