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

#0 とにかくPureScriptを動かしたい

はじめに

今回試したコードはこちら -> GitHub
まずPureScriptを動かしてみたいと思った動機について書く。
少し長いと感じる方は、環境を作る から読んでいただきたい。

PureScriptを見て

PureScriptを見て最初の感想は「なんか…かっこいい…」だった。
Haskellという言語をベースに作られたそうだ。かっこいい。
矢印はあっちこっち指してるし( greet :: String -> String :point_left:こういうやつ)、出てくる語句がとにかくかっこいい。

……が………

以下のコードを見ていただきたい。
公式 のhello worldである。

import Prelude
import Effect.Console (log)

greet :: String -> String
greet name = "Hello, " <> name <> "!"

main = log (greet "World")

かっこいいがなにがなんだか分からない。
しかもこのコード、コピペしても動かない。

他にも何個かコピペして試してみたが、90割くらい動かない。
ちょっと盛ってるが、本当に動かないのが多い。
どうやら現行のバージョンは 0.13.3 なのだが web上にあるサンプルコードのversionは少し古いもののようだ。

-- https://aratama.github.io/purescript/chapter01.html
module Example where

import Control.Monad.Eff.Console (log)

main = log "Hello, World!"

動かない

❯ pulp run
* Building project in /Users/hideyuki_hori/h_h/study-2019-09-18-purescript
Error found:
at src/Main.purs:1:1 - 1:7 (line 1, column 1 - line 1, column 7)

  Unable to parse module:
  Unexpected token 'import'


See https://github.com/purescript/documentation/blob/master/errors/ErrorParsingModule.md for more information,
or to contribute content related to this error.


* ERROR: Subcommand terminated with exit code 1

try purescript というページにあるコードをローカルのエディタにコピペしてみた。
これも動かないwww

逆にどうやったら動くのよと思い、意地でもhello worldしたくなった。

先程リンクを張ったページはどれも読んでるだけでワクワクする内容なので、ぜひ読んでいただきたい。
僕は英語が ぜんぜん あんまりわからないので、 実例によるPureScriptをたくさん読んだ。
意味は全然わかってないが、こういうエレガントなコードが書けるようになりたい。がんばるぞ

elmとかHaskellにも手を出した

記事は忘れたが、ググってるとelmやhaskellで少し慣らしたほうがいいという記事を見かけ、とりあえず以下の本を買った。
- 基礎からわかる Elm
- Haskell 教養としての関数型プログラミング

elmの方は全部読んだ。半分くらい写経した。
Haskellは1/3くらい写経してギブ…

読んでる間も、写経している最中も、僕はPureScriptのなんかよくわからんオーラが気になってしょうがなかった。
しばらくするとPureScriptのことばっかり考えて、どちらの本も読んだ気になってるだけだと感じた。
PureScriptを触って「elmなりHaskellが必要だな」と実感してからまた読もうと思った。

辿り着いた聖典

Qiitaに 純粋関数型スクリプト言語PureScriptのはじめかた というとてもドンピシャな記事があった。
とにかくここのコードを写経することにした。
この記事は 純粋関数型スクリプト言語PureScriptのはじめかた の丸パクリなので、当記事の価値について言われるとつらいものがあるが、書かせてほしい。
普通にコピペしても動かないくだりはちょっとおもしろかったんじゃないかなと思う。

環境を作る

PureScriptはaltJSである。
なのでNodejs + npmを入れていれる必要がある。
この手順は割愛させていただく。

必要なのはpurescriptとpulp、そしてbower

bowerとかさわったことないわ…と思い、npmでなんとかしようと探したがすぐ諦めた。
npm使ってる記事が全然ない…

なのでこうする。

$ npm install --global purescript pulp bower

これで

  • purescript -> コンパイラ
  • pulp -> ビルドツール
  • bower -> パッケージマネージャ

が手に入る。
聖典 にはbowerからいずれ脱却すると書いてあった。
bowerのこと全然知らないがなんとなくホッとしている。

ワークスペースを作る

適当なディレクトリで mkdir test とかしてfolderを作る。
その作ったディレクトリに入ったら

$ pulp init

これだけで開発環境が手に入る。

visual studio code

vscodeのpluginを入れると快適になるそうなので、以下のpluginをinstallした。

補完が効くようになるのでPureScript IDEは入れておいたほうがいい。
このIDEを使うためにPureScript Language Supportが必要。
後の3つは雰囲気で入れた。星ついてた。

……vscode-purtyだけはよくわからない。
名前だけ見ると shift + alt + f でコードを整えてくれるアレぽいが動かない。
vscodeの右下にエラー文言と一緒に npm install purty と出るのでやってみるとそれもエラーになる。
つらいのでもうちょっとレベルが上ったら調べようと思う。
// コメントいただけるととても嬉しいです

❯ npm i purty       
npm WARN enoent ENOENT: no such file or directory, open '/Users/hideyuki_hori/h_h/study-2019-09-18-purescript/package.json'
npm WARN study-2019-09-18-purescript No description
npm WARN study-2019-09-18-purescript No repository field.
npm WARN study-2019-09-18-purescript No README data
npm WARN study-2019-09-18-purescript No license field.

npm ERR! code ERR_INVALID_OPT_VALUE
npm ERR! The value "false" is invalid for option "readableHighWaterMark"

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/hideyuki_hori/.npm/_logs/2019-09-18T11_08_06_775Z-debug.log

普通に動くhello world

pulp run すると普通に Hello sailor! とターミナルに出てきた。
いらんことせず普通にやれば動くんだなと思った。
// sailorとは船乗りという意味らしい

その他 聖典 にあるserverの例をやってみた。

もうちょっとやりたい

他の人が作ったライブラリを使ってみたい。
なので手始めにNodejsの fs moduleにある readFile を使ってみたい。
標準モジュールなので普通にimportしたら使えるやろと思ったが使えない。
聖典 を見ると

他には一切のライブラリが含まれないため、コンパイラのみでは標準出力はおろか足し算すらできません。

えっこんな潔い言語あるんやという感想しか出てこなかった。
すごいなww

$ bower install -S purescript-node-fs

これで fs モジュールが手に入る。
import Node.FS.Sync (readTextFile) とやればimportできる。

謎の達成感。

Pursuit というドキュメントぽいページを見たが、importの書き方がのってなく、どう書いたらいいかちょっとググった。

他のmoduleも import Node.xxx.xxx みたいな感じでimportしていた。
たぶんそういうルールがあるんじゃないかなと思った。

purescript-node-fsのtest には import Node.FS.Async as A という別名つけれるぽいものを見かけテンションが上った。
……がその下のすごいネストにびっくりしてブラウザバックした。

log =<< readTextFile UTF8 "./src/Main.purs" とやれば src/Main.purs の中身がターミナルに出力される。

=<< という演算子、初めて見た。
ぜんぜん意味がわからないがとにかくかっこいい。

おわりに

少し触ってみたが、さらにPureScriptに惹き込まれた。
終始よくわからないがかっこいいという感想しか出てこなかったが、それでももっと触ってみたいなと思った。
次はファイル操作を通して =<< みたいな謎の演算子を理解したい。

Why do not you register as a user and use Qiita more conveniently?
  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
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