Help us understand the problem. What is going on with this article?

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

で確認できます。

参考文献

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした