この記事は (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 のコードを読む