LoginSignup
0
2

More than 5 years have passed since last update.

PureScript by Example の 6.4 を読む

Last updated at Posted at 2016-12-20

この記事は (bouzuya) PureScript Advent Calendar 2016 の 20 日目。 (bouzuya) PureScript Advent Calendar 2016 は bouzuya の PureScript 学習の記録だ。

概要

PureScript by ExamplePureScript Language GuidePursuit を見ながら進めていく。

今日は 6.4 を読む。ソースコードの例は [purescript-book の exercises/chapter6][purescript-book-chapter-6] にある。

※注意事項: 英語と日本語訳では大きな差異がある。0.10.x に対応している英語の側で進める。

この章のおさらい

この章では型クラス (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]

なるほど。MonoidmemptySemigroupappend を使い、 Foldablefoldl などでいい感じに処理できると。

あと 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 MaybeFunctor Array があるようだ。

関数 (\n -> n < 3)[1, 2, 3, 4, 5] (Array Int / Functor Array) に持ち上げて適用し、その結果 [true, true, false, false, false] を返す。ふむ。

関数 lengthJust "testing" (Maybe String / Functor Maybe) に持ち上げて適用し、その結果 Just 7 を返す。ふむ。

map に渡す関数は Functor の中身 (?) を取るっぽい。

Pursuit:

まとめ

6.4 だけのはずなのに、すごい勢いで型クラスを紹介されて消耗した。前回の Show もそうだけど、どれも基本っぽい感じがする。

次回以降の TODO

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2