HaskellなAltJS達をいじってみる

Haskell Advent Calender 2013 12/5日当番記事です。

CoffeeScriptとかHaxeとかTypeScriptみたいなJavascriptにトランスレートして使う言語たちをAltJSっていうそうです。HaskellコードをJSに変換するプログラムもいくつかあって、このページに一覧があって詳しい。そこに掲載されてるFayとHasteを触ってみます。他にUHCやGHCJSというのもありますが試したら弱冠インストールでハマったのでそれらは機会あればまた。

そいつらを上手く使えば、サーバサイトはYesodまたはScotty、クライアントサイドはHaskellなAltJSを使ってオールハスケルなWeb開発が(マークアップHaskellでやるやつとかもありますね)可能になります。ちなみにScottyのTipsを以前少し書いたので以下もあわせてどうぞ。

あと、おまけ

  • 量子将棋をHaskellで
    • (途中まで書いて放り出してます。クライアント側でcanvas使うGUIは作ってあるので思考エンジンが出来たら公開します…)
    • 量子将棋作者のna2hiroさんによると「将棋ったー」でホストされている量子将棋はバックエンドで動く量子将棋のルールのコア部分をHaskellで書いてるそうです。
      • getArgsでコマンドラインから文字列を受け取って標準出力に返すプログラムはWebサービスのバックで簡単に使えていいですね。Haskellのベストプラクティスの一つじゃないでしょうか。

さて、以下本題に戻ります。

Fay

Cabal installするだけなので簡単です。

# cabal install fay fay-base

happyが必要みたいなので入ってなかったらHappyを予め入れておきます。ubuntuならapt-getでhappyが入るので嬉しい。

クイックスタートやサンプルソースを見ると、JS上の要素をFayモナドとしてくみ上げていく方式のようです。JSONオブジェクトは自動的に変換してくれるそうなので、Haskell側で複雑な情報処理を行うJSON引数JSON戻り値な関数を作って、Fayモナド内でそれを呼ぶ感じで使うと便利そうですね。

module Alert where

import           FFI
import           Prelude

main :: Fay ()
main = alert "Hello, World!"

alert :: String -> Fay ()
alert = ffi "window.alert(%1)"

トランスレートはfayコマンドです。(cabal installした場合はcabalのbinディレクトにパスを通しておくこと)

fay --html-wrapper hello.hs

とすると、hello.htmlとhello.jsが出来るので、同じディレクトリにおいてページを開くだけです。こちらで見れます。

jQuery bidingsほか、いろいろとFayのプログラミングスタイルにバインディングするパッケージがあるようです。Fayは敷居が低くて簡単なのがいいですね。

Haste

これもcabal installするだけです。

# cabal install haste-compiler
# haste-boot

haste-bootはcabalインストールディレクトリの/binにあるのでパスを通すのを忘れずに。サンプルを動かしてみます。

# git clone https://github.com/valderman/haste-compiler.git
# cd haste-compiler/examples/canvas-simple/
# hastec canvas-simple.hs

hastecでコンパイルするとjsとhtmlが出力されるので、web見れるとこにページを開くだけ。こちらで見れます。Canvasグリグリのデモでいい感じです。

というわけで

HaskellなAltJSをさわってみました。個人的にはAltJSは(Haskellじゃないけど)Haxeが面白そうなのでそれも試したい。