Closed10

PureScript の訓練をする #1 導入

Kazuki MiyanishiKazuki Miyanishi

「PureScript by Example」を読みながら PureScript の訓練をしていく。

https://book.purescript.org/

ただ、このドキュメントの内容が古いという情報がある。

https://qiita.com/hiruberuto/items/2316b58162cfec150460

まだ内容がPureScript ver.0.11のままで、最新版のコンパイラでは本文のサンプルコードの多くがコンパイルできません。

この PureScript by Example のドキュメントは GitHub リポジトリで管理されていて、この gh-pages ブランチの最新のコミットが2021年4月12日と、割と新しいようだ。

https://github.com/purescript-contrib/purescript-book

ただ、このドキュメントの内容のすべてが最新版に沿っているとは限らないので、もしコンパイルができないなどの問題が起きたときは、PureScript 本体のリリースノートをチェックして補完するしかない。

https://github.com/purescript/purescript/releases

と、ここで Releases を見たら一昨日には v0.14.1 が出ている。うひょー。

Kazuki MiyanishiKazuki Miyanishi

PureScript by Example のトップページでは、以下のことについて簡単に説明されていた。

  • このリポジトリはコミュニティフォークを含み、最新のバージョンのコンパイラ、ライブラリ、ツールで動くように更新されている
  • 何か問題を発見したら報告をお願いします
  • PureScript は小さく強力で、表現豊かな型がある静的型のプログラミング言語だ
  • JavaScript による関数型プログラミングは最近多くの人に人気だけど、コードを書くための規律のある環境の欠如によって大規模開発が妨げられる
  • PureScript は JavaScript 開発の世界に強い型付き関数型プログラミングの力を持ってくることによってその問題を解決することに狙いを定めている
Kazuki MiyanishiKazuki Miyanishi

PureScript by Example では、以下の問題の事例を解決するとのこと。


  • maps と folds を使ったデータ構造の変換
  • applicative functor を使ったフォームフィールドのバリデーション
  • QuickCheck を使ったコードのテスト
  • canvas の使用
  • ドメイン固有言語の実装
  • DOMの操作
  • JavaScrit との相互運用性
  • 並列非同期実行

けっこういきなり実践的な感じだ。文法とかは教えてくれるんだろうか。

Kazuki MiyanishiKazuki Miyanishi

チャプター1 導入

https://book.purescript.org/chapter1.html

チャプター1 導入 の見出しは以下のようになっている。


  • 関数型 JavaScript
  • 型と型インターフェース
  • ポリグロットWebプログラミング
  • 前提条件
  • あなたについて
  • この本の読み方
  • ヘルプ
  • 著者について
  • 謝辞

「ポリグロット」って何だろう?

https://polyglot-challenge.com/2019/08/31/polyglotって何?マルチリンガルとの違いや有名人ポリ/

ポリグロットとは、一言で言ってしまうと、ずばり「多言語話者」の事。

多言語話者のことらしい。ここでは具体的に何を指してポリグロットと言っているのかはまだわからない。その節に入った時に分かればいいだろう。

Kazuki MiyanishiKazuki Miyanishi

関数型 JavaScript

しばらくの間、JavaScript 界に関数型プログラミングの波が来ていることについて紹介されている。mapfilterreduceとかもそうだし、非同期プログラミングでも第一級関数を値としてコールバックを定義するし、React とか Virtual DOM も純粋関数としての View のモデルを持っている。

関数を使うのは生産性向上につながるけど、それを JavaScript でやる場合、以下のような JavaScript の特徴が欠点になるとのこと。

  • 記述が冗長(書かないといけない字句が多い)
  • 型付けが無い
  • 強力な抽象形式が無い

制限のない JavaScript のプログラムは equational reasoning を難しくする、とのこと。equational reasoning ってなんだ?

直訳したら「等式推論」となるみたい。軽く調べてみたけど、今はまだ難しそうなので置いておく。

PureScript は上記問題に対処することを目的としているようだ。つまり、記述が冗長でなく、型付けがあり、強力な抽象形式があり、等式推論ができるということだ。それらの詳しい意味はまだわからない。

他の利点についてもいろいろと説明がされている。早く実践に入りたいというのもあるので、ここには細かく記録せずに次に進む。

Kazuki MiyanishiKazuki Miyanishi

型と型インターフェース

TypeScript の特徴もそうだけど、静的型のおかげでプログラムの正しさをコンパイル時に色々と確認できる、という説明がされていた。

あと、旧来のプログラミング言語のように型宣言をたくさん書かなくても型推論ができるのでコードがすっきりする。これも一応 TypeScript でもできるやつ。

さらに、型システムによる安全網(セーフティネット)が高度な抽象形式を可能にするとのこと。これはまだ具体的に何を意味するのかはわからない。

Haskell で言う「型クラス」に相当する基本的な型駆動な抽象形式が提供されるとのこと。Haskell の型クラスを知らないので、これもまだよくわからない。「抽象形式」というのが説明でよく登場するので、何か重要そうだ。

Kazuki MiyanishiKazuki Miyanishi

ポリグロットWebプログラミング

PureScript と JavaScript を組み合わせてWebプログラミングする方法について提案がされている。以下のようなケースが紹介されている。

  • コアロジックを PureScript で書いて、UI を JavaScript で書く
  • アプリを JavaScript か AltJS で書いて、テストを PureScript で書く
  • 既存のアプリの自動UIテストを PureScript で書く

おっと「コアロジック」というカタカナ語を使ってしまった。「中核的論理(?)」とかにしておいたほうがいいだろうか🤔

ここで言うポリグロット(多言語話者)は、PureScript と JavaScript を併用する、という意味だったようだ。

Kazuki MiyanishiKazuki Miyanishi

必要なもの

この PureScript by Example で使う必要なソフトウェアは最小限とのこと。

そして、この文書で解説しているコードは PureScript のバージョン 0.13.* と互換性があるとのこと。最新の 0.14 より前だった。なので、やはり問題が起きたらリリースノートを確認するという方法を取るしかないようだ。

Kazuki MiyanishiKazuki Miyanishi

対象読者

対象となる読者について、以下のような説明がされていた。

  • JavaScript の基本について知っている
  • JavaScript エコシステム(npm や Gulp など)について知っていると、必要に応じて環境のセットアップをカスタマイズできる(必須ではない)
  • 関数型プログラミングの予備知識は必要ないけど、知っていても害は無い
Kazuki MiyanishiKazuki Miyanishi

この本の読み方

初心者は最初から順番に読んでいけ、とのこと。

ヘルプ

Slack チャンネルや Discourse フォーラムなどが紹介されていた。

日本語圏のコミュニティはあるんだろうか。

英語だけど Reddit のコミュニティもあった。

https://www.reddit.com/r/purescript/

Teratail の PureScript タグは存在しない。(執筆時点)

https://teratail.com/tags/PureScript

StackOverflow 日本語版では PureScript タグがついた質問は3件。(執筆時点)

https://ja.stackoverflow.com/questions/tagged/purescript

著者

著者は Phil Freeman さん。ロサンゼルス在住のようで、若いころ(early age)からBASICでプログラミングをしていたとのこと。

次は、Chapter 2 の入門に入っていきます。

https://zenn.dev/mozukichi/scraps/bc53272dc3ccba

このスクラップは2021/04/23にクローズされました