Skip to content
Published on

モダンHaskell 2026 — GHC 9.10 / 9.12 / GHCup / Cabal 3.14 / Stack / IHP / Servant / Effectful / Pandoc / Cardano 徹底ガイド

Authors

プロローグ — 2026年もHaskellを書く人たちがいる

毎年誰かが訊く。「Haskell、まだ使ってるんですか?」

使っている。それもかなり真剣に。

  • GitHub はSemanticをHaskellで書き、コード検索インフラの一部がそれで動く。
  • Cardano はIOHK / IOGによるPlutusスマートコントラクト基盤で、コアノードはすべてHaskell。
  • Mercury BankChannableTweagIOGStandard CharteredAndurilWireHasura が本番Haskellコードベースを運用。
  • Pandoc — John MacFarlaneによるドキュメント変換器は学術・出版界の事実上の標準。Markdown→PDFのパイプラインはおおむねPandocを通る。
  • ShellCheckxmonaddarcspostgrestPureScriptElm 0.19コンパイラ(2018)dhallAgdaIdris もHaskell。

2010年代のHaskellの真の敵は「書くのが難しい」ではなかった。本当の敵は 「ビルドツールがCabalとStackで分かれていて、どちらも微妙に違う形で壊れている」 という体験だった。2026年はどうか。

答え:GHCupが両方を同時にうまく管理してくれる。だから「Cabalファイルをもらったが送り主はStack使いでビルドできない」という事故はほぼ消えた。さらにGHC自体も9.10・9.12でモジュール式コンパイルとマルチコアスケジューリング改善でもう一段速くなった。

この記事では、2026年のHaskellスタックを一息で見渡す。コンパイラ、ビルドツール、フルスタックWebフレームワーク、エフェクトライブラリ、ORM、パーサ、JSON、テスト、形式検証、ML、ドキュメント変換、そして人々まで。


1. モダンHaskell 2026 — GHC 9.xの時代

まず一枚の風景から。

                 モダンHaskell 2026スタック

[インストール]      GHCup(推奨) -> ghc / cabal / stack / hls
[コンパイラ]        GHC 9.10(2024-05)/ 9.12(2024-12)
[ビルド]            Cabal 3.14   |   Stack(LTS 22.x, Stackage)
[パッケージ]        Hackage(全件)|  Stackage(キュレーションLTS)

[フルスタックWeb]   IHP(Rails風, digitally induced)
[Web API]           Servant(型付きHTTP DSL)
[その他Web]         Yesod / Snap / Scotty / Spock

[エフェクト]        Effectful(mtl後継, 2026のデフォルト)
                    Polysemy / fused-effects / Bluefin

[ORM]               Persistent / Beam / Esqueleto

[パーサ]            Megaparsec / Attoparsec / Earley
[JSON]              Aeson
[文字列・バイト]    text / bytestring / vector

[テスト]            hedgehog(プロパティ)/ tasty / hspec / QuickCheck
[形式検証]          Liquid Haskell(refinement types)

[ML]                Hasktorch(libtorchバインディング)
[ドキュメント]      Pandoc(John MacFarlane)

[本番運用]          GitHub / Cardano / Mercury / IOG /
                    Hasura / Anduril / Channable / Tweag

これが2026年のHaskellの地図である。1つずつ箱を歩いていこう。


2. GHC 9.10(2024-05)/ 9.12(2024-12)

GHC(Glasgow Haskell Compiler)はHaskellの参照実装。実用上は唯一の産業向け実装。

GHC 9.10(2024年5月)

  • GHC2024言語エディション — 年単位で束ねた言語拡張パック。default-language: GHC2024 と書くだけで LambdaCaseDataKindsDerivingStrategiesDisambiguateRecordFieldsExplicitNamespacesMonoLocalBindsRoleAnnotationsScopedTypeVariables がデフォルトオン。
  • 線形型(-XLinearTypes) が成熟 — 関数型のリソース追跡の核。
  • GHC Proposals 511let 内での型シグネチャ記述が自然に。
  • JavaScriptバックエンド 安定化 — wasm32javascript バックエンドが正式サポート。
  • ランタイムシステム(GC, threaded RTS) のチューニング — -A デフォルト調整、64-bitでのコールドキャッシュ性能改善。

GHC 9.12(2024年12月)

  • CapiFFI 改善 — Cヘッダマクロ関数とのより安全なインタフェース。
  • OrPatterns 拡張 — パターンマッチで複数コンストラクタを | でまとめられる。
  • NamedDefaults — 型クラスのデフォルトインスタンスを明示的に宣言可能。
  • MultilineStrings — 三重引用符の複数行文字列。他言語ユーザに馴染みやすい形。
  • 型推論の一貫性 — 多相変数が曖昧になるケースが減少。
  • ビルド性能 — 平均5〜10%のコンパイル時間短縮。
-- GHC 9.12のMultilineStrings + OrPatterns
{-# LANGUAGE MultilineStrings #-}
{-# LANGUAGE OrPatterns #-}

greeting :: String
greeting = """
  Hello,
  modern Haskell 2026.
  """

classify :: Int -> String
classify n = case n of
  (0 | 1 | 2) -> "small"
  (3 | 4 | 5) -> "medium"
  _           -> "large"

どのバージョンを選ぶか

  • 新規プロジェクト:GHC 9.10.x — 最もバランスがよい。HLS・Stack LTS・IHP・Servantすべて一級サポート。
  • 冒険者:GHC 9.12.x — 新構文(MultilineStringsOrPatterns)が欲しいとき。
  • エンタープライズ・依存ツリーが長い:GHC 9.8.x — もう少し保守的に。
  • レガシー:GHC 9.6未満 — 2026年に新規開始する理由はない。

3. GHCup — 推奨インストーラ

2020年頃のHaskellインストールは「Stackを入れて終わり」が定番だった。Cabal派は別に入れ、両者は微妙に噛み合わなかった。

2026年は GHCupが公式推奨インストーラ である。haskell.org/ghcup の一行スクリプトでGHC・Cabal・Stack・HLS(Haskell Language Server)が一式入る。

# 公式の一行インストール
curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh

# またはWindows PowerShell
# Set-ExecutionPolicy Bypass -Scope Process -Force
# Invoke-WebRequest ... ghcup-windows-... .ps1 | Invoke-Expression

インストール後 ghcup tui でテキストモードUIが開き、欲しいGHC・Cabal・Stack・HLSバージョンを選んで導入・削除できる。

ghcup install ghc 9.10.1
ghcup install ghc 9.12.1
ghcup set ghc 9.10.1            # システムデフォルトを9.10に
ghcup install cabal 3.14.1.0
ghcup install hls 2.9.0.0       # Haskell Language Server(LSP)
ghcup install stack 3.1.1
ghcup list                       # 導入済み・利用可能バージョン一覧

GHCupの本質的価値は 同一ホストにGHCを複数バージョン共存させられる こと。cabal.projectstack.yaml の指定から自動的に正しいGHCを選ぶ。

参考:macOS・Linuxは上記スクリプトが標準、WindowsはGHCupがChocolatey経由ではなくネイティブインストール。WSLユーザも同じスクリプトでOK。


4. Cabal 3.14 / Stack — ビルドツール

GHCがコンパイラなら、Cabal・Stackはその上のパッケージ・プロジェクトマネージャ。

Cabal 3.14

Cabalは実は2つの存在。

  1. Cabalライブラリ*.cabal ファイル形式を読み依存グラフを構築するコア。
  2. cabal-install CLI — そのライブラリを使うコマンドラインツール。通常「cabal」と呼ぶときはこちら。

Cabal 3.14(2024年末リリース)の改善:

  • cabal repl のマルチコンポーネント対応 — ライブラリ・実行ファイル・テストスイートを1つのREPLで。
  • cabal-installの依存解決器 の高速化 — 大規模依存ツリーで体感差。
  • cabal.project.local の優先順位を明確化。
  • 再現可能ビルドindex-state ピン留めがより安定。
-- my-app.cabal(Cabal 3.14)
cabal-version:      3.14
name:               my-app
version:            0.1.0.0
synopsis:           A sample modern Haskell app
license:            BSD-3-Clause
build-type:         Simple

common warnings
  ghc-options: -Wall -Wcompat -Widentities -Wincomplete-uni-patterns

library
  import:           warnings
  exposed-modules:  MyApp
                    MyApp.Server
  build-depends:    base ^>= 4.20
                  , servant ^>= 0.20
                  , servant-server ^>= 0.20
                  , warp ^>= 3.4
                  , aeson ^>= 2.2
                  , text ^>= 2.1
  hs-source-dirs:   src
  default-language: GHC2024

executable my-app
  import:           warnings
  main-is:          Main.hs
  build-depends:    base, my-app
  hs-source-dirs:   app
  default-language: GHC2024

test-suite my-app-test
  import:           warnings
  type:             exitcode-stdio-1.0
  main-is:          Spec.hs
  build-depends:    base, my-app, hspec ^>= 2.11, tasty ^>= 1.5
  hs-source-dirs:   test
  default-language: GHC2024

Stack

StackはFP Completeで始まり、現在はHaskell Foundation配下のコミュニティが保守。Cabalとの大きな違いは デフォルトでキュレーションされたStackage LTSスナップショットを使う こと。

# stack.yaml
resolver: lts-22.30  # Stackage LTS — 同時にビルド検証されたパッケージ群
packages:
  - .
extra-deps: []

Stackage LTSは毎週マイナー、6か月ごとに新メジャー。「これらのパッケージは一緒にビルドでき、テストも一緒に通る」が約束。

どちらを選ぶか

  • 新規・速さ重視:Stack(Stackage LTS) — 依存衝突の心配が少ない。
  • ライブラリ・主流OSS:Cabal — Hackage直接公開が自然。
  • 両対応:大型プロジェクトの多くは cabal.projectstack.yaml の両方を持つ。

2026年はCabal陣営の進化が速いが、Stackの「ノイズが少ない」UXも依然魅力的。


5. Hackage / Stackage — パッケージ生態系

Hackage

hackage.haskell.org — Haskellの中央パッケージリポジトリ。2026年で約18,000パッケージ。誰でも投稿可能で、バージョンはSemVer類似のPVP(Package Versioning Policy)に従う。

cabal update                     # Hackageインデックス更新
cabal install --installdir=./bin pandoc
cabal info aeson                 # パッケージ情報

Stackage

stackage.org — Hackage上のキュレーション層。LTS(長期サポート)とNightlyに分かれる。

  • LTS-22.x(2024年末) — GHC 9.8 / 9.10ベース
  • LTS-23.x(2025年半ば) — GHC 9.10 / 9.12ベース
  • Nightly — 毎日ビルド、最新パッケージ群

Stackageが重要な理由:「パッケージXはYと衝突する」がキュレーション段階で除外される。ライブラリ作者が stack.yamlresolver: lts-22.30 と書けば、その束のすべてが一緒にビルドできる。


6. IHP(Integrated Haskell Platform)— フルスタックWeb

ihp.digitallyinduced.com — ドイツのdigitally induced GmbHによるフルスタックWebフレームワーク。狙いは Haskellで Rails / Phoenix / Laravel 級の体験を提供 することにある。

IHPの哲学

  • 設定より規約 — ディレクトリ構成と命名規約に従えば書くコードが減る。
  • 型安全 — ルータ・フォーム・DBクエリ・ビューが型で結ばれる。
  • 開発ツール — 開発サーバ・マイグレーションGUI(IHP IDE)・コード生成器。
# 新規IHPプロジェクト
nix-shell -p ihp-new --run "ihp-new my-blog"
cd my-blog
./start                          # http://localhost:8000

IHPモデル例

-- Application/Schema.sql(SQLで直接定義)
CREATE TABLE posts (
    id UUID DEFAULT uuid_generate_v4() PRIMARY KEY NOT NULL,
    title TEXT NOT NULL,
    body TEXT NOT NULL,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() NOT NULL
);

-- Web/Controller/Posts.hs(生成物を軽く編集)
module Web.Controller.Posts where
import Web.Controller.Prelude
import Web.View.Posts.Index

instance Controller PostsController where
    action PostsAction = do
        posts <- query @Post |> fetch
        render IndexView { .. }
-- Web/View/Posts/Index.hs
module Web.View.Posts.Index where
import Web.View.Prelude

data IndexView = IndexView { posts :: [Post] }

instance View IndexView where
    html IndexView { .. } = [hsx|
        <h1>Posts</h1>
        <ul>
            {forEach posts renderPost}
        </ul>
    |]
        where
            renderPost post = [hsx|<li>{get #title post}</li>|]

hsx クォージクオータの中ではIHP専用のクオージクオータが動作するため、中括弧の補間がHaskell値として安全に解釈される。これはIHPのDSL内だけの話で、通常のHaskellファイルとは異なる。

IHPが向く場面

  • 個人のサイドプロジェクト — RailsのようにCRUDを速く回したいとき。
  • 小規模チームのSaaSバックオフィス — マイグレーション・認証・管理画面が標準装備。
  • Haskell初心者の入口 — モナドトランスフォーマと正面衝突せずに「動くWebアプリ」を作れる。

7. Servant — 型付きHTTP API

IHPがフルスタックなら、Servantは API専用ライブラリ。中心的アイデアはひとつ:APIを型レベルで表現する

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}

module Api where

import Data.Aeson (FromJSON, ToJSON)
import GHC.Generics (Generic)
import Servant

data User = User
  { userId   :: Int
  , userName :: String
  } deriving (Generic)

instance ToJSON User
instance FromJSON User

-- APIを型として
type UserAPI =
       "users" :> Get '[JSON] [User]
  :<|> "users" :> Capture "id" Int :> Get '[JSON] User
  :<|> "users" :> ReqBody '[JSON] User :> Post '[JSON] User

-- その型のハンドラ
userAPI :: Server UserAPI
userAPI = listUsers :<|> getUser :<|> createUser
  where
    listUsers     = pure [User 1 "alice", User 2 "bob"]
    getUser uid   = pure (User uid "alice")
    createUser u  = pure u

このコードの肝は、UserAPI という が真実のソースであること。

  • ハンドラを間違えると コンパイルが通らないGet '[JSON] [User] と宣言したルートが Int を返すと GHC が拒否する。
  • クライアント — servant-client — も同じ型から自動生成。
  • OpenAPI / Swagger文書 — servant-openapi3 — も同じ型から自動生成。

Servant + warpでサーバを立てる

import Network.Wai.Handler.Warp (run)
import Servant

main :: IO ()
main = do
  putStrLn "Listening on http://localhost:8081"
  run 8081 (serve (Proxy :: Proxy UserAPI) userAPI)

Servantのユーザ

  • Hasura GraphQL Engine の内部サービス
  • ChannableMercury BankWire
  • 多数のOSSバックエンド

API変更が即コンパイルエラーになる安全網が核心の価値。


8. Yesod / Snap / Scotty / Spock — その他のWeb

Yesod(Michael Snoyman)

yesodweb.com — Stack / Stackage の作者でもあるMichael Snoymanによるフルスタックフレームワーク。IHPより歴史が古く、型安全なURL型安全なウィジェット など重めの型活用で有名。

-- Foundation.hs(Yesodルーティング)
mkYesodData "App" [parseRoutes|
/                HomeR   GET
/posts           PostsR  GET POST
/posts/#PostId   PostR   GET DELETE
|]

Snap

snapframework.com — 学術ルーツが強いフレームワーク。Snaplets というモジュール合成が特徴。新規開発は減ったが既存プロジェクトでは稼働中。

Scotty

hackage.haskell.org/package/scottySinatra風マイクロフレームワーク。短く軽いAPIを素早く立ち上げるのに向く。

{-# LANGUAGE OverloadedStrings #-}
import Web.Scotty

main :: IO ()
main = scotty 3000 $ do
  get "/" $ text "hello scotty"
  get "/hello/:name" $ do
    n <- captureParam "name"
    text ("hello, " <> n)

Spock

Scottyと同等のマイクロフレームワークだが、セッション・CSRF・DBプーリングなどのミドルウェアが標準同梱。

どれを選ぶか

  • 型付きAPI中心:Servant。
  • マイグレーションまでフルスタック:IHP。
  • フルスタック・深い型活用:Yesod。
  • マイクロサービス・サイドカー:Scotty。
  • セッション・認証込みのマイクロ:Spock。

9. エフェクトシステム — Effectful / Polysemy / fused-effects / Bluefin

Haskellの強みであり参入障壁でもあるのがエフェクトシステム。副作用 — IO、状態、例外、ロギング、DBアクセス — を型で追跡する。

伝統は mtlスタイル:モナドトランスフォーマ(StateTReaderTExceptT)を積み上げる。強力だがエラーメッセージが長くなり、性能上のトレードオフも実在する。

2026年は Effectful がほぼ新標準になっている。

Effectful

hackage.haskell.org/package/effectful — Polysemy / fused-effects より単純なモデル、コンパイラに優しい性能、mtlに近い書き味。

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE GADTs #-}

import Effectful
import Effectful.Reader.Static (Reader, ask, runReader)
import Effectful.Error.Static (Error, throwError, runError)

-- エフェクト明示:Reader + Error
loadUser :: (Reader String :> es, Error String :> es) => Int -> Eff es String
loadUser uid = do
  prefix <- ask
  if uid > 0
    then pure (prefix ++ ": user-" ++ show uid)
    else throwError "invalid uid"

main :: IO ()
main = do
  result <- runEff
          . runError @String
          . runReader "PREFIX"
          $ loadUser 42
  print result   -- Right "PREFIX: user-42"

Polysemy

hackage.haskell.org/package/polysemy — 「Free Monad + Free Algebra」の学術的本流。強力な再解釈能力、型が重い。

fused-effects

hackage.haskell.org/package/fused-effects — キャリア方式のエフェクト。コンパイル時にエフェクト合成を展開して性能を稼ぐ。

Bluefin

hackage.haskell.org/package/bluefin — 2024〜25年に登場した新参。scoped effectsdelimited continuations を一級で扱う。GHC 9.10の新RTS機能を活用。

-- Bluefin風(概念例)
import Bluefin.Eff
import Bluefin.State

bumpCounter :: e :> es => State Int e -> Eff es Int
bumpCounter ref = do
  modify ref (+ 1)
  get ref

どれを選ぶか

  • 新コード・mtl感覚:Effectful。
  • 研究・教育・強い表現力:Polysemy。
  • 性能重視・固定の呼び出しグラフ:fused-effects。
  • 新しもの好き・scoped effects:Bluefin。

10. ORM — Persistent / Beam / Esqueleto

Persistent(Yesod陣営)

Michael Snoyman の persistent — DSLでモデルを書くと、コンパイラがそれを受けてデータ型とマイグレーションを生成。SQLとNoSQLの両方をサポート。

{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}

import Database.Persist.TH

share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
Post
    title Text
    body  Text
    deriving Show
User
    name  Text
    posts [PostId]
    deriving Show
|]

Beam

haskell-beam.github.io — Genericベースで、より型安全なSQL。PersistentよりSQL寄りの抽象化。Postgres / MySQL / SQLite対応。

Esqueleto

Persistent上に乗って 型安全なJOINとサブクエリ をEDSLで表現。

import qualified Database.Esqueleto.Experimental as E

-- ユーザごとの投稿数
usersWithPostCount = E.select $ do
  (u E.:& p) <- E.from $ E.table @User
       `E.leftJoin` E.table @Post
       `E.on` (\(u E.:& p) -> E.just (u E.^. UserId) E.==. p E.?. PostUserId)
  E.groupBy (u E.^. UserId)
  pure (u, E.count (p E.?. PostId))

どれを選ぶか

  • 素早いCRUD:Persistent。
  • JOIN中心の分析クエリ:Esqueleto on Persistent。
  • SQLに近く大きなドメイン:Beam。

11. Megaparsec — パーサコンビネータ

hackage.haskell.org/package/megaparsec — 2026年標準のパーサコンビネータ。Parsecの後継で、Attoparsecと違い 人間が読めるエラーメッセージ が核心の価値。

{-# LANGUAGE OverloadedStrings #-}
import Data.Void (Void)
import Text.Megaparsec
import Text.Megaparsec.Char
import qualified Text.Megaparsec.Char.Lexer as L
import Data.Text (Text)

type Parser = Parsec Void Text

data JsonValue
  = JNull
  | JBool Bool
  | JNumber Double
  | JString Text
  | JArray  [JsonValue]
  deriving Show

sc :: Parser ()
sc = L.space space1 (L.skipLineComment "//") empty

lexeme :: Parser a -> Parser a
lexeme = L.lexeme sc

jsonNull :: Parser JsonValue
jsonNull = JNull <$ lexeme (string "null")

jsonBool :: Parser JsonValue
jsonBool = JBool True  <$ lexeme (string "true")
       <|> JBool False <$ lexeme (string "false")

jsonNumber :: Parser JsonValue
jsonNumber = JNumber <$> lexeme L.signed L.float

jsonValue :: Parser JsonValue
jsonValue = choice [jsonNull, jsonBool, jsonNumber]

Megaparsecの強み:

  • 自動の位置追跡 — エラーが行・桁で表示される。
  • ユーザ定義エラーcustomFailure でドメイン特有の失敗を追加。
  • バックトラッキング制御try で明示的に。

Pandoc自身も内部でMegaparsec(と前世代のParsec)を幅広く使う。


12. Aeson — JSON

hackage.haskell.org/package/aeson — Haskellの事実上の標準JSONライブラリ。2026年は2.2系メジャーが安定。

{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE OverloadedStrings #-}

import Data.Aeson
import GHC.Generics

data Post = Post
  { postId    :: Int
  , postTitle :: String
  } deriving (Show, Generic)

instance ToJSON Post where
  toEncoding = genericToEncoding defaultOptions
instance FromJSON Post

main :: IO ()
main = do
  let p  = Post 1 "Hello"
      bs = encode p
  print bs
  print (decode bs :: Maybe Post)

Aeson 2のポイント

  • KeyMap — オブジェクトキーが Text から Key に変わり、衝突・ハッシュ安全性が向上。
  • Genericデフォルトが十分速い — Template Haskellマクロを使わなくて済む場面が増えた。
  • Custom OptionsfieldLabelModifiersnake_casecamelCase の変換が自然。
options :: Options
options = defaultOptions
  { fieldLabelModifier = camelTo2 '_'   -- postId -> post_id
  , omitNothingFields  = True
  }

13. テスト — hedgehog / tasty / hspec

Haskellのテスト生態系は3本柱。

hspec(BDD)

import Test.Hspec

main :: IO ()
main = hspec $ do
  describe "sum" $ do
    it "sums an empty list to 0" $
      sum ([] :: [Int]) `shouldBe` 0
    it "sums [1,2,3] to 6" $
      sum [1, 2, 3 :: Int] `shouldBe` 6

tasty(テストランナー)

複数のテストライブラリを1つのツリーにまとめるランナー。tasty-hspectasty-hedgehogtasty-hunit などのアダプタがある。

import Test.Tasty
import Test.Tasty.HUnit

main :: IO ()
main = defaultMain $ testGroup "all"
  [ testCase "trivial" $ (1 + 1) @?= (2 :: Int)
  ]

hedgehog(プロパティテスト)

QuickCheckの後継。目玉は integrated shrinking — 失敗例が自動で最小反例まで縮む。

import Hedgehog
import qualified Hedgehog.Gen as Gen
import qualified Hedgehog.Range as Range

prop_reverse_involutive :: Property
prop_reverse_involutive = property $ do
  xs <- forAll $ Gen.list (Range.linear 0 100) (Gen.int Range.linearBounded)
  reverse (reverse xs) === xs

プロパティテストの強力さ:「ケース5本」ではなく「数千の任意入力で不変式が成立する」と主張する。失敗するとhedgehogが自動で縮めて読みやすい反例を返してくれる。

選び方

  • BDDユニットテスト:hspec。
  • ランナー統合:tasty。
  • プロパティ + 自動縮小:hedgehog。

14. Liquid Haskell — refinement types

ucsd-progsys.github.io/liquidhaskell-blog/ — 通常のHaskellの上に refinement types(精緻化型) を載せる形式検証ツール。

中心的アイデア:型の横に述語を書くと、SMTソルバ(Z3など)がコンパイル時にその述語が常に成立することを証明する。

{-@ measure llen @-}
llen :: [a] -> Int
llen []     = 0
llen (_:xs) = 1 + llen xs

{-@ head :: { xs:[a] | llen xs > 0 } -> a @-}
head :: [a] -> a
head (x:_) = x
head []    = error "won't happen"   -- LHがこの行を到達不能と証明

LHは「この関数は空リストで呼び出せない」を 型の一部 として記述させ、呼び出し側がその条件を満たさなければコンパイラが拒否する。

学界と一部の産業(ブロックチェーン、航空・自動車安全分野)で使われている。


15. Hasktorch — 機械学習

hasktorch.org — PyTorchのlibtorchライブラリをHaskellからバインディング。TweagやHaskellMLが積極的に開発。

{-# LANGUAGE DataKinds #-}
import Torch

main :: IO ()
main = do
  x <- randn' [2, 3]     -- Tensor [2, 3]
  y <- randn' [3, 4]
  let z = matmul x y
  print z

Hasktorchが魅力的なのは 型でテンソル形状を表現できる 点。

import Torch.Typed

-- コンパイル時に形状を検証する行列積
matmul' :: Tensor '[2, 3] Float -> Tensor '[3, 4] Float -> Tensor '[2, 4] Float
matmul' = matmul

形状の合わない行列を掛けようとするとGHCが拒否する。PyTorch民の典型的なミスがコンパイル時に潰せる。


16. Pandoc — John MacFarlane

pandoc.org — UC Berkeley哲学科教授 John MacFarlane が2006年から保守する 万能ドキュメント変換器。入力40種類前後、出力60種類前後。Markdown・LaTeX・DOCX・HTML・ePub・PDF・MediaWiki・RSTなどの間を自由に往復する。

# Markdown -> PDF
pandoc README.md -o readme.pdf

# Markdown -> DOCX with citations
pandoc paper.md --citeproc --bibliography refs.bib -o paper.docx

# HTML -> EPUB
pandoc book.html -o book.epub --metadata title="My Book"

Pandocの内部構造も美しい。

  • PandocAST — どの入力形式でもこのASTに正規化される。
  • Reader — 形式別のパーサ(Markdown reader, LaTeX reader, ...)。
  • Writer — 形式別のシリアライザ(HTML writer, LaTeX経由のPDF writer, ...)。
  • Filter — LuaかHaskellでASTを変換。

Haskell生態系のなかで最も可視性の高い「エンドユーザが毎日使う」プロジェクト。


17. Cardano — Charles Hoskinson と IOG

cardano.org — Ethereum共同創設者 Charles Hoskinson がEthereumを離れて作ったブロックチェーン基盤。運営は IOG(Input Output Global、旧IOHK)。ノードは 全部Haskell、スマートコントラクトは Plutus(Haskell DSL)で書く。

なぜHaskellか:

  • 形式検証 — 金融を扱うため、コードが仕様を満たすことを数学的に示す必要がある。
  • 純粋性 — 合意アルゴリズムは決定論的であるべき。IOを隔離するHaskellは自然な選択。
  • 型システム — 検証済みの変更を保証する。

Cardanoコアの構成:

  • cardano-node — ノードデーモン、Haskell。
  • cardano-ledger — 元帳ルール、Haskellの仕様から直接実装。
  • plutus-core — スマートコントラクトのコア言語。
  • Plutus Tx — Plutusへコンパイルされるハスケル部分集合。
-- Plutus Tx(概念例)
{-# INLINABLE mkValidator #-}
mkValidator :: () -> Integer -> ScriptContext -> Bool
mkValidator _ guess _ = guess == 42

このバリデータがオンチェーンに乗りトランザクションを検証する。PlutusはHaskellの部分集合をPlutus Coreという独自のコア言語にコンパイルし、ノードがそれを評価する。


18. 韓国 / 日本 — Haskell Korea / ja-haskell / IOHK Japan

韓国

  • Haskell Korea(Facebook グループ・Discord) — 2010年代半ばから続くコミュニティ。四半期ごとに不定期ミートアップ。
  • 出版物:「Haskell Programming from First Principles」の翻訳の一部、国内著者による「Programming Haskell」系の書籍。
  • 大学:KAIST、ソウル大、POSTECHのPLグループが教育・研究でHaskellを利用。
  • 産業利用は限定的だが、フィンテック・セキュリティの一部チームが導入。

日本

  • ja-haskell — 日本語Haskellコミュニティ Slack・X。週次で活発。
  • Haskell Day、不定期の Haskell Symposium Japan — 発表中心イベント。
  • 書籍:山本和彦(IIJ Lab)の「プログラミングHaskell」翻訳、その他多数。
  • IOHK Japan — Cardano IOGの日本法人が東京にあり、世界的に見てもHaskell採用が最も活発な拠点のひとつ。
  • 産業:Tsuru CapitalHERPDrivemode(Hondaに買収) などがHaskell利用。

英語コミュニティ(r/haskell・Haskell Discourse・Discord)に加えて、両地域のコミュニティ資料も併読すると入口が滑らかになる。


19. 誰がHaskellを学ぶべきか

明確な推奨は2通り。

1. 関数型プログラミングを正面から学びたい

JavaScript / Kotlin / Scala / OCamlで関数型スタイルを書くのと、純粋性と遅延評価がデフォルト の環境で書くのは別物。Haskellは逃げ道がない。すべての副作用が型に現れる。最初は息苦しいが、一度馴染むと 他の言語を書くときの思考モデルが変わる

2. 検証・DSLの価値が大きいドメイン

  • 金融(デリバティブ価格計算、決済)
  • ブロックチェーンのスマートコントラクト
  • コンパイラ・言語ツール(Pandoc、ShellCheck、Idris、dhall などはすべてHaskell)
  • 形式検証が必要な航空・自動車・医療の一部
  • 複雑なドメインルールを持つ保険・税務

Haskellが向かない場面

  • チームが大きく、Haskellを知るのが自分だけ — 採用・オンボーディングのコストが高い。
  • 非常に短いMVPでライブラリが手薄なドメイン。
  • システムプログラミング・組込み — Rustの方が自然。

20. 参考 / References

  • GHC 9.10 release notes — downloads.haskell.org/ghc/9.10.1/docs/users_guide/9.10.1-notes.html
  • GHC 9.12 release notes — downloads.haskell.org/ghc/9.12.1/docs/users_guide/9.12.1-notes.html
  • GHCup — www.haskell.org/ghcup/
  • Cabal — cabal.readthedocs.io
  • Stack — docs.haskellstack.org
  • Stackage — www.stackage.org
  • Hackage — hackage.haskell.org
  • IHP — ihp.digitallyinduced.com
  • Servant — docs.servant.dev
  • Yesod — www.yesodweb.com
  • Snap — snapframework.com
  • Scotty — hackage.haskell.org/package/scotty
  • Effectful — hackage.haskell.org/package/effectful
  • Polysemy — hackage.haskell.org/package/polysemy
  • fused-effects — hackage.haskell.org/package/fused-effects
  • Bluefin — hackage.haskell.org/package/bluefin
  • Persistent — hackage.haskell.org/package/persistent
  • Beam — haskell-beam.github.io
  • Esqueleto — hackage.haskell.org/package/esqueleto
  • Megaparsec — hackage.haskell.org/package/megaparsec
  • Aeson — hackage.haskell.org/package/aeson
  • hedgehog — hedgehog.qa
  • tasty — hackage.haskell.org/package/tasty
  • hspec — hspec.github.io
  • Liquid Haskell — ucsd-progsys.github.io/liquidhaskell-blog/
  • Hasktorch — hasktorch.org
  • Pandoc — pandoc.org
  • Cardano — cardano.org
  • IOG — iohk.io
  • Haskell Foundation — haskell.foundation
  • Haskell Korea — Facebook group / Discord
  • ja-haskell — haskell.jp