この記事は (bouzuya) PureScript Advent Calendar 2016 の 13 日目。 (bouzuya) PureScript Advent Calendar 2016 は bouzuya の PureScript 学習の記録だ。
- ← 12 日目『 PureScript by Example 4 章の終わりと 5 章の冒頭を読む 』
- → 14 日目『 PureScript by Example 5.7 〜を読む - Qiita 』
概要
PureScript by Example を PureScript Language Guide や Pursuit を見ながら進めていく。
今日は PureScript by Example の 5 章の前半を読む。
※注意事項: 英語と日本語訳では大きな差異がある。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) を扱うらしい。
Language Guide:
PureScript by Example 5.3
簡単なパターンマッチの例。
gcd :: Int -> Int -> Int
gcd n 0 = n
gcd 0 m = m
gcd n m = if n > m
then gcd (n - m) m
else gcd n (m - n)
イメージどおりに動く (雑) 。引数で n 0
0 m
n m
というパターンを用意し、それにマッチした場合の結果を書いておく。
PureScript by Example 5.4
シンプルなパターン。イメージどおりに動く (雑) 。 Number
String
Char
Boolean
のリテラルとワイルドカードパターン (_
) が動作すると書いてある。なるほど。
fromString :: String -> Boolean
fromString "true" = true
fromString _ = false
toString :: Boolean -> String
toString true = "true"
toString false = "false"
代数的データ型が章の名に含まれているので、それらのパターンマッチも出てくるはずだ。
これらの例でぼくが面白いと感じる点は fromString _
や toString false
の行を削除するとコンパイルエラーになることだ。代数的データ型の話がまだ出てきていないので書きづらいのだけど、 Boolean
は true
と false
からなる。その両方を網羅していない場合はコンパイルエラーになる。
PureScript by Example 5.5
|
でガードを書けるらしい。さらに分けられる。ふむ。
gcd :: Int -> Int -> Int
gcd n 0 = n
gcd 0 n = n
gcd n m | n > m = gcd (n - m) m
| otherwise = gcd n (m - n)
PureScript by Example 5.6
今日は Array
パターンで終わろう。Array
リテラルでマッチできる。
isEmpty :: forall a. Array a -> Boolean
isEmpty [] = true
isEmpty _ = false
takeFive :: Array Int -> Int
takeFive [0, 1, a, b, _] = a * b
takeFive _ = 0
> import Prelude
> :paste
… let
… takeFive [0, 1, a, b, _] = a * b
… takeFive _ = 0
…
> takeFive [0, 1, 2, 3, 4]
6
> takeFive [1, 2, 3, 4, 5]
0
> takeFive []
0
> takeFive [0, 1, 2, 3, 4, 5]
0
なるほど。これは良い。
Array
パターンは固定長を前提としているらしい。可変長にしたいなら Data.List
を使えと。なるほど。
参考
- PureScript by Example
- 実例による PureScript
- paf31/purescript-book
- Language Guide
- Language Guide - Top-level declarations
次回以降の TODO
- PureScript by Example & PureScript Language Guide を読み進める
-
Array
以外でのdo
記法 - Tagged Unions / Newtype
psc-package
- PureScript IDE の導入
- 24 Days of PureScript, 2016
- 24 Days of PureScript, 2014
- 某氏の記事の紹介
- github.com/purescript のコードを読む
- github.com/purescript-node のコードを読む
- github.com/purescript-contrib のコードを読む