この記事は (bouzuya) PureScript Advent Calendar 2016 の 20 日目。 (bouzuya) PureScript Advent Calendar 2016 は bouzuya の PureScript 学習の記録だ。
- ← 19 日目『 PureScript by Example の 6.1, 6.2, 6.3 を読む - Qiita 』
- → 21 日目『 PureScript by Example の 6.5, 6.6 を読む - Qiita 』
概要
PureScript by Example を PureScript Language Guide や Pursuit を見ながら進めていく。
今日は 6.4 を読む。ソースコードの例は [purescript-book の exercises/chapter6][purescript-book-chapter-6] にある。
※注意事項: 英語と日本語訳では大きな差異がある。0.10.x に対応している英語の側で進める。
- PureScript by Example 2016-12-05 時点で 0.10.x 向け
- 実例による PureScript 2016-12-05 時点で 0.7 向け
- PureScript Language Guide 対象バージョン不明
この章のおさらい
この章では型クラス (type classes) を扱うらしい。
class / instance キーワードと型クラス Show を見た。必要に応じて :: 演算子で型を指定する方法も見た。
Pursuit:
PureScript by Example 6.4
Eq
Eq 型クラス。いままで == の operator alias 経由で使ってきた eq を定義している。
Pursuit:
Ord
Ord 型クラス。compare を定義している。 LT EQ GT を返す。
Pursuit:
Field
Field 型クラス。体 (field) 。検索した感じ抽象代数学に由来する名前っぽいけど、ぼくにはよく分からない。この型クラスとその親 (?) となる型クラスで四則演算を定義しているように見える。参考: 可換体 - Wikipedia
class (EuclideanRing a) <= Field a
class (CommutativeRing a) <= EuclideanRing a where -- ...
class (Ring a) <= CommutativeRing a
class (Semiring a) <= Ring a where -- ...
class Semiring a where -- ...
体 (field) ・ユークリッド環 (euclidean ring) ・可換環 (commutative ring) ・半環 (semiring) ……だろう。 Semiring はゼロイチと加算乗算、 Ring は減算、 EuclideanRing は剰余などを定義している。
Pursuit:
Semigroup
Semigroup 型クラス。半群 (semigroup) 。また分からない。Pursuit を見る限り結合 (<> / append) できるもののように見える。半群 - Wikipedia
Pursuit:
Monoid
purescript-monoid パッケージの Monoid 型クラス。モノイド (monoid) 。またまた分からない。 Pursuit を見る限り mempty を提供する Semigroup っぽい。 mempty は単位元 (?) を表しているのだろうか。空っぽい。 モノイド - Wikipedia
Pursuit:
Foldable
purescript-foldable-traversable パッケージの Foldable 型クラス。 fold できるのだろう。 4 章で fold は散々出てきた。
> foldl append mempty ["Hello", " ", "World"]
"Hello World"
> foldl append mempty [[1, 2, 3], [4, 5], [6]]
[1,2,3,4,5,6]
なるほど。Monoid の mempty と Semigroup の append を使い、 Foldable の foldl などでいい感じに処理できると。
あと Monoid String / Monoid (Array Int) (Monoid (Array a)) もあることが分かる。 https://github.com/purescript/purescript-monoid/blob/v2.2.0/src/Data/Monoid.purs#L29-L33 確かにある。
Pursuit:
Functor
Functor 型クラス。関手 (functor) 。<$> / map を提供する。データ構造に関数を持ち上げる (?) らしい。なるほど、分からない。
class Functor f where
map :: forall a b. (a -> b) -> f a -> f b
関数 a -> b と Functor f a をとって Functor f b を返す。ふむ。
> import Prelude
> map (\n -> n < 3) [1, 2, 3, 4, 5]
[true, true, false, false, false]
> import Data.Maybe
> import Data.String (length)
> map length (Just "testing")
(Just 7)
Functor Maybe や Functor Array があるようだ。
関数 (\n -> n < 3) を [1, 2, 3, 4, 5] (Array Int / Functor Array) に持ち上げて適用し、その結果 [true, true, false, false, false] を返す。ふむ。
関数 length を Just "testing" (Maybe String / Functor Maybe) に持ち上げて適用し、その結果 Just 7 を返す。ふむ。
map に渡す関数は Functor の中身 (?) を取るっぽい。
Pursuit:
まとめ
6.4 だけのはずなのに、すごい勢いで型クラスを紹介されて消耗した。前回の Show もそうだけど、どれも基本っぽい感じがする。
次回以降の TODO
- PureScript by Example & PureScript Language Guide を読み進める
-
Array以外でのdo記法 psc-package- 24 Days of PureScript, 2016
- 24 Days of PureScript, 2014
- 某氏の記事の紹介
- github.com/purescript のコードを読む
- github.com/purescript-node のコードを読む
- github.com/purescript-contrib のコードを読む