Help us understand the problem. What is going on with this article?

PureScript by Example 2 章を読む

More than 3 years have passed since last update.

この記事は (bouzuya) PureScript Advent Calendar 2016 の 6 日目です。 (bouzuya) PureScript Advent Calendar 2016 は bouzuya の PureScript 学習の記録です。

概要

昨日に続き PureScript by ExamplePureScript Language Guide を見ながら進めていきます。今日は PureScript by Example の 2 章 を読みます。

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

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

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-mathMath (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-preludepurescript-consolepurescript-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-mathpurescript/purescript-math を見る限りほとんど JavaScript の Math を、 FFI : Foreign Function Interface を使って利用しているだけのようですね。

loglogShow の違いは 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

bouzuya
ぼく、ぼうずや。なさけはひとのためならず。たのしいはせいぎ。
http://bouzuya.net/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした