HaskellっぽいAltJSなPureScriptの環境作る

HaskellっぽいAltJSでPureScriptというのがあるそうなので興味本位で使ってみる。完全なHaskellのサブセットではなく、JavaScriptとの親和性を意識してるっぽい印象。

Haskellとの違いは以下に記載されてる↓
Differences from Haskell · purescript/purescript Wiki · GitHub
設計として意図的な差分なのか、実装としてまだできていないだけなのか区別されてないですが。

Hello world出すだけだったら簡単だけど、ライブラリをimportしようと思うとちゃんとビルド周りをちゃんと構築しないといけなくて自分用のメモ。環境はMac OS X(10.10)でGHC7.8.3でpurescript 0.6.2です。

まだJavaScriptのエコシステムに不慣れなのでディレクトリ構成とかビルド周りこのへんのチュートリアルが参考にしてます↓
Read PureScript by Example | Leanpub

PureScript自体はHaskellで書かれているのでHaskell Platformがなければ入れてください。このへん↓
Download Haskell Platform
あとcabalは最新にしておいてください。

$ cabal install Cabal cabal-install

Haskell環境使えるようになったらcabalでpurescriptをインストールする。

$ cabal update
$ cabal install purescript

purescriptの周辺ライブラリはpurescriptで書かれてbowerで管理されてて、jsへのコンパイルとかはgruntを使うのでgruntとbowerを入れる。

$ npm install -g grunt-cli bower

以下のコードをsrc/test.pursとして保存する。

module Test where

import Debug.Trace
import Math

diagonal w h = sqrt (w * w + h * h)

main = print (diagonal 3 4)

以下のビルド用の定義をGruntfile.jsとして保存する。

module.exports = function(grunt) {

  "use strict";

  grunt.initConfig({

    srcFiles: ["src/**/*.purs", "bower_components/**/src/**/*.purs"],

    psc: {
      options: {
        main: "Test",
        modules: ["Test"]
      },
        all: {
          src: ["<%=srcFiles%>"],
          dest: "dist/Main.js"
      }
    }
  });

  grunt.loadNpmTasks("grunt-purescript");

  grunt.registerTask("default", ["psc:all"]);
};

gruntのpurescript用のプラグインを入れる

$ npm install grunt grunt-purescript@0.5.1

npmのプロジェクトを作る。

$ npm init

いろいろ聞かれるがとりあえず使えればよいのでデフォルトでEnter連打。

package.jsonプラグインの依存関係を追加する。

{
  "name": "psbook",
  "version": "0.0.0",
  "description": "",
  "main": "Gruntfile.js",
  "dependencies": {
    "grunt": "^0.4.5",
    "grunt-purescript": "^0.5.1"
  },
  "devDependencies": {
    "grunt-purescript": "0.5.1"
  },
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

これでnpm installすれば依存するビルドツールがインストールできるようなる。

$ npm install

コードが依存するライブラリはbowerでインストールする。

$ bower install purescript-math#0.1.0

依存関係定義にするのにbowerの定義ファイル作る

$ bower init

いろいろ聞かれるがとりあえず使えればよいのでデフォルトでEnter連打。

bower.jsonに以下のように依存するライブラリを記載する。

{
  "name": "psbook",
  "version": "0.0.0",
  "authors": [
  "minamijoyo <minamijoyo@gmail.com>"
  ],
  "license": "MIT",
  "ignore": [
  "**/.*",
  "node_modules",
  "bower_components",
  "test",
  "tests"
  ],
  "dependencies": {
    "purescript-math": "0.1.0"
  }
}

これでbower updateすれば依存関係がインストールできるようになる。

$ bower update

準備完了。gruntコマンドでビルドする。

$ grunt

main実行するのは、

$ node dist/Main.js
5

というのでコード書ける環境がやっとできた。