現在私が分かっている範囲。
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」に該当するらしい。
macOS
$ curl -sSL https://get.haskellstack.org/ | sh
Windows
下記サイトよりインストーラーをダウンロード
Get Started with Haskell WindowsLinux
$ wget -qO- https://get.haskellstack.org/ | sh
詳しくは下記サイトを参照
Get started with Haskellよりシンプルな形にするために、プロジェクトを手動で作成します。
$ mkdir spock-web
$ cd spock-web
$ mkdir src
「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
「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 タグを埋め込めます。
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)