自己紹介

PureScriptとは

  • JavaScriptにコンパイルされるAltJS
  • 純粋関数型プログラミング言語
  • Haskell系の文法
  • 正格評価
  • コンパイラはHaskellで実装
  • 去年の9月ころにできた新しい言語

PureScriptの主な機能

  • 型推論
  • 代数的データ型
  • パターンマッチ
  • 型クラス
  • do記法
  • シンプルなFFI

PureScriptの型システム

  • HMFに近いランクN多相を持つ型推論
  • 通常のtypeとarrowに加えて、effectとrowのカインドがある
  • HMFとRow Polymorphismの組み合わせはekmettさんたちが開発しているErmineでも採用されている
  • どちらもHMの拡張で比較的簡単に実装できてパワフル

Row Polymorphism

fullName p = p.lastName ++ " " ++ p.firstName

と定義すると

forall r. { lastName :: String, firstName :: String | r } -> String

という型が推論される

fullName { firstName: "Kotori", lastName: "Minami", age: 16 }

firstNameとlastNameというフィールドを持つレコードなら渡せる

Row Polymorphism

EffectとRow

foreign import data Eff :: # ! -> * -> *
  • ! はEffectのカインド
  • # はRowのカインド
  • PureScriptの副作用はEffモナドで管理される
  • HaskellのIOより副作用(effect)を細かく管理できる

EffectとRow (副作用を型チェックする)

module Main where

import Control.Monad.Eff
import Control.Monad.Eff.Random
import Debug.Trace

main :: Eff (random :: Random, trace :: Trace) {}
main = do
  n <- random
  print n

EffectとRow (例外処理)

import Control.Monad.Eff
import Control.Monad.Eff.Exception
import Data.Either

div :: forall r. Number -> Number -> Eff (err :: Exception String | r) Number
div _ 0 = throwException "Division by zero"
div n m = return (n / m)

divPure :: Number -> Number -> Either String Number
divPure n m = runPure (catchException (return <<< Left) (Right <$> div n m))

その他PureScriptのいいところ

  • 生成されたJavaScriptが綺麗
  • JavaScriptとの相互呼び出しが簡単
  • 開発がとても活発
  • gruntやbowerなど使った実戦的な開発環境が整っている
  • セルフホスティングの開発が進んでいる

<Thank You!>