Posted at

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

で確認できます。


参考文献