この記事は (bouzuya) PureScript Advent Calendar 2016 の 17 日目。 (bouzuya) PureScript Advent Calendar 2016 は bouzuya の PureScript 学習の記録だ。
- ← 16 日目『 PureScript by Example の 5.12, 5.13, 5.14 を読む - Qiita 』
- → 18 日目『 PureScript by Example の 5.16, 5.17, 5.18 を読む - Qiita 』
概要
PureScript by Example を PureScript Language Guide や Pursuit を見ながら進めていく。
今日は 5.15 から読んでいく。ソースコードの例は 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) を扱うらしい。
Number
String
Char
Boolean
Array
Record
のパターンマッチを見た。またガード・パターンマッチのネスト・ @
で名前付け・ case
式・部分関数と unsafePartial
を見た。data
で定義できる代数的データ型とそれを使ったパターンマッチを見た。
Language Guide:
PureScript by Example 5.15
newtype
。代数的データ型のうち、ひとつの構築子とひとつの引数だけを取るもののときに使える。つまり既存の型に新しい名前をつけるもの。実行時には同じものとして扱われるが、型システム上は別のものとして扱われる。
Language Guide:
newtype Pixels = Pixels Number
newtype Inches = Inches Number
なるほど。間違えて Inches
に Pixels
を指定しなくて済む。実行時には同じものなので、性能上のデメリットがない、と。
ためしてみる。
f :: Inches -> Number
f (Inches n) = n
> f (Inches 10.0)
10.0
> f (Pixels 10.0)
Error found:
in module $PSCI
at line 1, column 4 - line 1, column 15
Could not match type
Pixels
with type
Inches
while checking that type Pixels
is at least as general as type Inches
while checking that expression Pixels 10.0
has type Inches
in value declaration it
See https://github.com/purescript/purescript/wiki/Error-Code-TypesDoNotUnify for more information,
or to contribute content related to this error.
当然、エラーになる。
pulp browserify
した結果を見てみる。確かに違いがない。
// ...
// Generated by psc version 0.10.2
"use strict";
var Pixels = function (x) {
return x;
};
var Inches = function (x) {
return x;
};
var f = function (v) {
return v;
};
module.exports = {
Inches: Inches,
Pixels: Pixels,
f: f
};
// ...
まとめ
newtype
だけ。進んでいない。
参考
- PureScript by Example
- 実例による PureScript
- paf31/purescript-book
- Language Guide
- Language Guide - Newtypes
次回以降の TODO
- PureScript by Example & PureScript Language Guide を読み進める
-
Array
以外でのdo
記法 - Newtype
psc-package
- 24 Days of PureScript, 2016
- 24 Days of PureScript, 2014
- 某氏の記事の紹介
- github.com/purescript のコードを読む
- github.com/purescript-node のコードを読む
- github.com/purescript-contrib のコードを読む