Spock   イントロ

ホーム


Haskell の Web アプリケーション

現在私が分かっている範囲。

Haskell の Web フレームワークとしては、「Happstack」「Snap」「Yesod」 が三強。日本では Yesod の一強。

Haskellのご謹製として、Wai ( Web Application Interface ) と Warp がある。

Waiは、Web アプリケーションのための API。Windows でいうところの「Win32API」 のようなもの。Warp は、Web (HTTP) サーバー

Yesod は、Wai を使っている。Yesod 以外で Wai を使うものとして、「Spock」と 「Scotty」がある。

Yesod、Spock、Scotty を比べると、Yesod が最も機能的で難しく、Scotty が最も シンプルで易しい。Spock はその中間。

Spock を Scotty よりやや機能的とする評価もあるみたいだけど、Yesod と Scotty の中間として考えたほうが合っているらしい。

Yesod が Ruby の「Ruby on Rails」に該当するとすれば、Scotty は Ruby の「Sinatra」に該当するらしい。

Stack のインストール

macOS


$ curl -sSL https://get.haskellstack.org/ | sh
    

Windows

下記サイトよりインストーラーをダウンロード

Get Started with Haskell Windows

Linux


$ wget -qO- https://get.haskellstack.org/ | sh
    

詳しくは下記サイトを参照

Get started with Haskell

プロジェクトの作成

よりシンプルな形にするために、プロジェクトを手動で作成します。


$ mkdir spock-web
$ cd spock-web
$ mkdir src
    

Cabal ファイルの作成

「spock-web」プロジェクト内に、次の内容の「spock-web.cabal」という ファイルを作ります。


name:                spock-web
version:             0.1.0.0
category:            Web
build-type:          Simple
cabal-version:       >=1.10

executable spock-web
  main-is:            Main.hs
  build-depends:      base >=4.10 && <4.11
                    , Spock
  hs-source-dirs:     src
  default-language:   Haskell2010
    

Main.hs の作成

「spock-web」プロジェクト内の「src」ディレクトリ内に、 次の内容の「Main.hs」というファイルを作ります。


{-# LANGUAGE OverloadedStrings #-}
module Main where

import Web.Spock
import Web.Spock.Config

main :: IO ()
main = do
    cfg <- defaultSpockCfg () PCNoDatabase ()
    runSpock 8080 (spock cfg (get root (text "こんにちは")))
    

ビルド


$ stack init
$ stack build
    

初回のビルドは「Spock」の開発環境と実行環境をインストールするため、 非常に時間がかかります。2回目からのビルドはすぐに終わります。 「stack init」は、初回の1回だけで構いません。

実行


$ stack exec spock-web
Spock is running on port 8080
    

ブラウザを起動して「https://localhost:8080/」へアクセスすると、次のように表示されます。

終了させるには、 ターミナルで、「Control」キー押しながら「c」 を押します。


^C
    

コード説明


{-# LANGUAGE OverloadedStrings #-}
    

Spockでは、文字は、Text 型でないと表示できないみたいです。 この言語拡張を読み込むと、通常の "あいうえお"という文字列リテラルが、 自動的に Text 型に変換されるそうです。


import Web.Spock
import Web.Spock.Config
    

この2つで、Spock を使うために必要な、 ほぼすべてのライブラリが入っている模様です。


    cfg <- defaultSpockCfg () PCNoDatabase ()
    

Config が必ず必要になります。このコードでは、 データベースは使用しない設定になっている模様です。


runSpock 8080 (spock cfg (get root (text "こんにちは")))
    

「runSpock」で Web アプリケーションを起動します。

HTMLタグ

次のようにすると HTML タグを埋め込めます。


runSpock 8080 (spock cfg (get root
        (html "<h1>こんにちは</h1><p>Spock Webフレームワーク</p>")))
    

しかし、この方法では、コードの二重引用符の間に改行を含めることはできません。 「Lucid」というライブラリを使うともっと自由に HTML タグを埋め込めるようになります。

「spock-web.cabal」の「build-depndes:」に「ludid」と「Spock-lucid」 を追加します。


  build-depends:      base >=4.10 && <4.11
                    , Spock
                    , lucid
                    , Spock-lucid
    

「Main.hs」を次のように変更します。


{-# LANGUAGE OverloadedStrings #-}
module Main where

import Web.Spock
import Web.Spock.Config
import Web.Spock.Lucid (lucid)
import Lucid

main :: IO ()
main = do
    cfg <- defaultSpockCfg () PCNoDatabase ()
    runSpock 8080 (spock cfg (get root ( lucid ( do
        h1_ "こんにちは"
        h3_ "Spock Webフレームワーク"
        p_ "今日はいかがですか"
        ))))
    

コードを整える

通常は、「(get root ...」以下のコードは別の識別子に束縛します。

「Main.hs」を次のように書き換えます。


{-# LANGUAGE OverloadedStrings #-}
import Web.Spock
import Web.Spock.Config
import Web.Spock.Lucid (lucid)
import Lucid

app :: SpockM () () () ()
app = do
    get root $ lucid $ do
        h1_ "こんにちは"
        h3_ "Spock Webフレームワーク"
        p_ "今日はいかがですか"

main :: IO ()
main = do
    cfg <- defaultSpockCfg () PCNoDatabase ()
    runSpock 8080 (spock cfg app)
    


3483 visits
Posted: Feb. 16, 2019
Update: Feb. 28, 2019

ホーム   ページトップ