PureScript by Example 2 章を読む

この記事は [(bouzuya) PureScript Advent Calendar 2016](http://www.adventar.org/calendars/1494) の 6 日目です。 (bouzuya) PureScript Advent Calendar 2016 は bouzuya の PureScript 学習の記録です。

- ← 5 日目『 [PureScript by Example 1 章を読む - Qiita][2016-12-05] 』
- → 7 日目『 [PureScript by Example 3 章の前半を読む - Qiita][2016-12-07] 』

## 概要

昨日に続き [PureScript by Example](https://leanpub.com/purescript/read) と [PureScript Language Guide](https://github.com/purescript/purescript/wiki/Language-Guide) を見ながら進めていきます。今日は [PureScript by Example の 2 章](https://leanpub.com/purescript/read#leanpub-auto-getting-started) を読みます。

ただ 2 章はまた Getting Started で、 Getting Started は [2016-12-04][] にしたところなので、飛ばし気味で進めます。

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

- [PureScript by Example](https://leanpub.com/purescript/read) 2016-12-05 時点で 0.10.x 向け
- [実例による PureScript](http://hiruberuto.bitbucket.org/purescript/) 2016-12-05 時点で 0.7 向け
- [PureScript Language Guide](https://github.com/purescript/purescript/wiki/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 貼っておきます。

- [Importing Modules](https://github.com/purescript/purescript/wiki/Language-Guide#importing-modules)
- [Function application](https://github.com/purescript/purescript/wiki/Language-Guide#function-application)

ここでは特に何も指定せずに `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` します。

https://pursuit.purescript.org/packages/purescript-math/2.0.0/docs/Math#v:sqrt

```
$ $(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 インスタンスを取れる感じですね。

https://github.com/purescript/purescript-console/blob/v2.0.0/src/Control/Monad/Eff/Console.purs#L20-L20

## 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][paf31/24-days-of-purescript-2016]
- [24 Days of PureScript, 2014](https://gist.github.com/paf31/8e9177b20ee920480fbc)
- 某氏の記事の紹介
- [github.com/purescript](https://github.com/purescript/) のコードを読む
- [github.com/purescript-node](https://github.com/purescript-node) のコードを読む
- [github.com/purescript-contrib](https://github.com/purescript-contrib) のコードを読む

[2016-12-01]: http://qiita.com/bouzuya/items/a5be85ec3e496e5bf436
[2016-12-02]: http://qiita.com/bouzuya/items/806335ea74ead0e33d95
[2016-12-03]: http://qiita.com/bouzuya/items/86cc9aaaddcc1aa790cf
[2016-12-04]: http://qiita.com/bouzuya/items/b2b80c22c50d0c1e739c
[2016-12-05]: http://qiita.com/bouzuya/items/f19ee0b86e9aec3f0afa
[2016-12-07]: http://qiita.com/bouzuya/items/62c6ad30ecba3c68a7a3
[paf31/24-days-of-purescript-2016]: https://github.com/paf31/24-days-of-purescript-2016
[purescript/purescript-math]: https://github.com/purescript/purescript-math