この記事は (bouzuya) PureScript Advent Calendar 2016 の 18 日目。 (bouzuya) PureScript Advent Calendar 2016 は bouzuya の PureScript 学習の記録だ。
- ← 17 日目『 PureScript by Example の 5.15 を読む - Qiita 』
- → 19 日目『 PureScript by Example の 6.1, 6.2, 6.3 を読む - Qiita 』
概要
PureScript by Example を PureScript Language Guide や Pursuit を見ながら進めていく。
今日は 5.16 から 5 章の終わりまでを読んでいく。ソースコードの例は purescript-book の chapter5 にある。
※注意事項: 英語と日本語訳では大きな差異がある。0.10.x
に対応している英語の側で進める。
- PureScript by Example 2016-12-05 時点で 0.10.x 向け
- 実例による PureScript 2016-12-05 時点で 0.7 向け
- PureScript Language Guide 対象バージョン不明
前回までのおさらい
この章では代数的データ型 (algebraic data type) とパターンマッチ (pattern matching) および行多相 (row polymorphism) を扱うらしい。
5 章のここまでに出てきたものは次のとおり。あとは例だけのはずなので、これでほぼすべて。
- Wildcard Patterns (
_
) - Literal Patterns (
Number
/String
/Char
/Boolean
...) - Array Patterns (
[x, y]
) - Constructor Patterns (
Foo s
) - Record Patterns (
{ foo: "Foo", bar: n }
) - Nested Patterns (
{ arr: [x, _], take: "firstOfTwo" }
) - Named Patterns (
a@[_, _]
) - Guard
case
- 部分関数 /
Partial
/unsafePartial
data
newtype
Language Guide:
- Pattern Matching - Language Guide
- Tagged Unions - Language Guide
- Newtypes - Language Guide
- Top-level declarations - Language Guide
PureScript by Example 5.16
type
でシノニムを定義している。 type
keyword とシノニムは 3 章で出てきた。
type Picture = Array Shape
Language Guide:
昨日の newtype
との違いは、type
は別名をつけるだけなので互換性があり、 newtype
は別の型なので互換性がない。
> type Int' = Int
> :paste
… let
… x :: Int'
… x = 123
…
> x
123
> newtype Int'' = Int'' Int
> :paste
… let
… y :: Int''
… y = 123
…
Error found:
in module $PSCI
at line 3, column 7 - line 3, column 7
Could not match type
Int
with type
Int''
while checking that type Int
is at least as general as type Int''
while checking that expression 123
has type Int''
in value declaration y
See https://github.com/purescript/purescript/wiki/Error-Code-TypesDoNotUnify for more information,
or to contribute content related to this error.
Picture
を使って showPicture
を定義する。
showPicture :: Picture -> Array String
showPicture = map showShape
手を抜いて purescript-book に書いてあるものを使って psci で試す。
> import Data.Picture
> :paste
… showPicture
… [ Line (Point { x: 0.0, y: 0.0 })
… (Point { x: 1.0, y: 1.0 })
… ]
…
["Line [start: (0.0, 0.0), end: (1.0, 1.0)]"]
良さそう。
PureScript by Example 5.17
今度は data
で Bounds
を定義する。 |
が使われていないところを見ると newtype
でも良さそうだけど……。
data Bounds = Bounds
{ top :: Number
, left :: Number
, bottom :: Number
, right :: Number
}
いくつかの Data.Picture
の関数を使って bounds
を定義する。emptyBounds
・ \/
および shapeBounds
は Data.Picture
の中に定義されているのでそれを見ると良い。
bounds :: Picture -> Bounds
bounds = foldl combine emptyBounds
where
combine :: Bounds -> Shape -> Bounds
combine b shape = shapeBounds shape \/ b
ふむ。
まとめ
5 章を終えた。type
data
newtype
が出た。パターンマッチも出た。{ foo: String | r }
のような行多相も出た。
参考
- PureScript by Example
- 実例による PureScript
- paf31/purescript-book
- Language Guide
- Language Guide - Newtypes
- Language Guide - Pattern Matching
- Language Guide - Tagged Unions
- Language Guide - Top-level declarations
次回以降の 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 のコードを読む