この記事は (bouzuya) PureScript Advent Calendar 2016 の 6 日目です。 (bouzuya) PureScript Advent Calendar 2016 は bouzuya の PureScript 学習の記録です。
- ← 5 日目『 PureScript by Example 1 章を読む - Qiita 』
- → 7 日目『 PureScript by Example 3 章の前半を読む - Qiita 』
概要
昨日に続き PureScript by Example と PureScript Language Guide を見ながら進めていきます。今日は PureScript by Example の 2 章 を読みます。
ただ 2 章はまた Getting Started で、 Getting Started は 2016-12-04 にしたところなので、飛ばし気味で進めます。
※注意事項: 英語と日本語訳では大きな差異があります。0.10.x
に対応している英語の側で進めます。
- PureScript by Example 2016-12-05 時点で 0.10.x 向け
- 実例による PureScript 2016-12-05 時点で 0.7 向け
- PureScript Language Guide 対象バージョン不明
PureScript by Example 2.1
この章では、 PureScript 開発環境のセットアップとシンプルな PureScript ライブラリを書くのが目標だそうです。直角三角形の対角線の長さを計算する関数を提供するライブラリだそうです。
興味のわかない実用的な例ですね。
PureScript by Example 2.2
psc
/ npm
/ pulp
のセットアップすることを説明しています。
今日までに既に実施したので、ほとんどスルーしていきます。
PureScript by Example 2.3
psc
のインストール。スルー。
PureScript by Example 2.4
bower
/ pulp
のインストール。スルー。
PureScript by Example 2.5
Hello, PureScript! です。
module Main where
import Control.Monad.Eff.Console
main = log "Hello, World!"
pulp run
で実行。終わり。 module
からはじまることや、モジュール名に .
を含める (例: My.First.Module
) ことができること、関数呼び出しは関数名のあとを空白で区切ればいいことなどが書いてあります。
一応 Language Guide 貼っておきます。
ここでは特に何も指定せずに import
していますね。関数適用は Language Guide を見ても大して情報量が変わらないですね。カリー化のことは書いてありますが、そのうち出てくる気がするのでここはスルー。
PureScript by Example 2.6
pulp browserify
。スルー。
PureScript by Example 2.7
pulp build -O
。 -O
は --optimise
。出力されているコードが読める JavaScript である点が重要、と。ふむ。main
はすべてのモジュールが定義されてから実行される、と。ふむ。function
で wrap されるのは特に珍しいことではないですね。どんなランタイムライブラリにも依存しない、と。feature に書いてあるとおりですね。
(function(exports) {
"use strict";
var Control_Monad_Eff_Console = PS["Control.Monad.Eff.Console"];
var main = Control_Monad_Eff_Console.log("Hello, World!");
exports["main"] = main;
})(PS["Main"] = PS["Main"] || {});
PureScript by Example 2.8
pulp build
。スルー。
PureScript by Example 2.9
purescript-math
の Math
(sqrt
) を使うために bower install
します。
$ $(npm bin)/bower install -S purescript-math\#2.0.0
これで pulp init
で追加される purescript-prelude
と purescript-console
、purescript-psci-support
をあわせて、次のような依存関係になりますね。
bower.json
(の一部) :
"dependencies": {
"purescript-prelude": "^2.1.0",
"purescript-console": "^2.0.0",
"purescript-math": "^2.0.0"
},
"devDependencies": {
"purescript-psci-support": "^2.0.0"
}
PureScript by Example 2.10
src/Main.purs
:
module Main (diagonal, main) where
import Control.Monad.Eff (Eff)
import Control.Monad.Eff.Console (CONSOLE, logShow)
import Math (sqrt)
import Prelude (Unit, (*), (+))
diagonal :: Number -> Number -> Number
diagonal w h = sqrt (w * w + h * h)
main :: Eff (console :: CONSOLE) Unit
main = logShow (diagonal 3.0 4.0)
$ npm run pulp:run
> project3@1.0.0 pulp:run /Users/bouzuya/project3
> pulp run
* Building project in/Users/bouzuya/project3
* Build successful.
5.0
purescript-math
は purescript/purescript-math を見る限りほとんど JavaScript の Math
を、 FFI : Foreign Function Interface を使って利用しているだけのようですね。
log
と logShow
の違いは logShow a = log (show a)
な感じ。show
についてはまたそのうち出てくるのでスルー。 Show インスタンスを取れる感じですね。
PureScript by Example 2.11
psci
で上記の関数を試すようです。特に新しい内容はないはず。
npm run pulp:psci
> project3@1.0.0 pulp:psci /Users/bouzuya/project3
> pulp psci
Compiling Math
Compiling Main
PSCi, version 0.10.2
Type :? for help
> import Main
> diagonal 5.0 12.0
13.0
let double x = x * 2
など、いろいろ触っているようですね。
PureScript by Example 2.11 Exercise
面倒なのでスルー。
PureScript by Example 2.12
まとめ。スルー。
まとめ
2 章は環境構築と入門的な内容で、この Advent Calendar 的には重複が多いですね。かといって新しい内容が多いと、こんな風には進めないんですけど……。
余談ですけど、書いている途中に Visual Studio Code の環境構築を書きそびれたことに気づきました。 PureScript IDE を入れておけば、 import
を自動で調整してくれるなど、幸せになるのですが……。
次回以降の TODO
psc-package
- PureScript by Example & PureScript Language Guide を読み進める
- 24 Days of PureScript, 2016
- 24 Days of PureScript, 2014
- 某氏の記事の紹介
- github.com/purescript のコードを読む
- github.com/purescript-node のコードを読む
- github.com/purescript-contrib のコードを読む