Haskell
CircleCI
docker
stack

stackを使ってhaskellで最小のWeb Applicationしてみる

More than 3 years have passed since last update.

HaskellでWeb Applicationをはじめてみたいと思う。
調べてみると、Rubyのrackのようなものとしてwaiがある。
stackを使って最小のサンプルをつくってみる。

stackは別途インストールして欲しい。Mac OSXなら

$ brew install haskell-stack

でインストールできる。他の環境はこちらで確認してください。

はじめに、プロジェクトをつくります。名前は wai-sampleとしました。

$ stack new wai-sample simple
$ cd wai-spmale

wai-sampleディレクトリが生成されます。
プログラムはwai-sample/srcに書いていくことになります。

利用するライブラリを追加してあげる必要があります。waiとwarpとhttp-typeを使うので、wai-sample.cabalに追加します。

wai-sample.cabal
  build-depends:       base >= 4.7 && < 5
    , warp, wai, http-types

となるように、以下のコマンドを実行します。

$ echo "    , wai, warp, http-types" >> wai-sample.cabal

"Hello wai"と出力するウェブサーバをつくってみます。
とある事情で環境変数PORTでポートを切り替えられるようにしています。

Main.hs
{-# LANGUAGE OverloadedStrings #-}
module Main where

import Network.Wai (responseLBS, Application)
import Network.HTTP.Types (status200)
import Network.Wai.Handler.Warp (run, Port)
import System.Environment (getEnvironment)
import Data.List (lookup)
import Data.Maybe

main :: IO ()
main = do
  port <- getPort
  putStr "start Server: http://localhost:"
  print port
  run port helloApp

helloApp :: Application
helloApp req respond = respond $ responseLBS status200 [] "Hello wai"

getPort :: IO Port
getPort = getEnvironment >>= return . port
  where
    port = fromMaybe defaultPort . fmap read . lookup "PORT"

defaultPort :: Port
defaultPort = 3000

記述ができたら、コンパイルして実行してみましょう。

$ stack build
$ stack exec wai-sample

stack buildでビルドできて、execにプロジェクト名で実行できます。

http://localhost:3000 にアクセスすれば, 「Hello wai」と表示されます。
とても簡単です。

ソースコード: https://github.com/eiel/wai-sample
Docke Image: https://hub.docker.com/r/eiel/wai-sample/

もっと詳しく

Haskell三大Webアプリケーションフレームワークは

  • yesod
  • snap
  • HappStack

らしいです。今回利用しているのはwaiを採用しているのはyesodのみ。
yesodはいろいろ便利ですがハードルが少し高いように思います。
waiに対応しているウェブサーバの、warpが良さそうなので、waiを使うことにしました。
waiに対応しているフレームワークでyesod以外にはscottyspockなどがあり、yesodよりは入門しやすいです。
今回はフレームワークを使わないサンプルを用意しました。

プロジェクトを作成するのに使用した newサブコマンドですが、第2引数(全体でみると第3引数)はテンプレート名です。

stack new wai-sample simple

であればsimpleというtemplateを利用しています。
templateの一覧は

stack templates

で確認できます。

参考文献