필사 모드: モダンHaskell 2026 — GHC 9.10 / 9.12 / GHCup / Cabal 3.14 / Stack / IHP / Servant / Effectful / Pandoc / Cardano 徹底ガイド
日本語プロローグ — 2026年もHaskellを書く人たちがいる
毎年誰かが訊く。「Haskell、まだ使ってるんですか?」
使っている。それもかなり真剣に。
- **GitHub** はSemanticをHaskellで書き、コード検索インフラの一部がそれで動く。
- **Cardano** はIOHK / IOGによるPlutusスマートコントラクト基盤で、コアノードはすべてHaskell。
- **Mercury Bank**、**Channable**、**Tweag**、**IOG**、**Standard Chartered**、**Anduril**、**Wire**、**Hasura** が本番Haskellコードベースを運用。
- **Pandoc** — John MacFarlaneによるドキュメント変換器は学術・出版界の事実上の標準。Markdown→PDFのパイプラインはおおむねPandocを通る。
- **ShellCheck**、**xmonad**、**darcs**、**postgrest**、**PureScript**、**Elm 0.19コンパイラ(2018)**、**dhall**、**Agda**、**Idris** も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` と書くだけで `LambdaCase`・`DataKinds`・`DerivingStrategies`・`DisambiguateRecordFields`・`ExplicitNamespaces`・`MonoLocalBinds`・`RoleAnnotations`・`ScopedTypeVariables` がデフォルトオン。
- **線形型(`-XLinearTypes`)** が成熟 — 関数型のリソース追跡の核。
- **GHC Proposals 511** — `let` 内での型シグネチャ記述が自然に。
- **JavaScriptバックエンド** 安定化 — `wasm32` と `javascript` バックエンドが正式サポート。
- **ランタイムシステム(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 — 新構文(`MultilineStrings`・`OrPatterns`)が欲しいとき。
- **エンタープライズ・依存ツリーが長い**: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.project` や `stack.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.project` と `stack.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.yaml` に `resolver: 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
instance Controller PostsController where
action PostsAction = do
posts <- query @Post |> fetch
render IndexView { .. }
-- Web/View/Posts/Index.hs
module Web.View.Posts.Index where
data IndexView = IndexView { posts :: [Post] }
instance View IndexView where
html IndexView { .. } = [hsx|
{forEach posts renderPost}
|]
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
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でサーバを立てる
main :: IO ()
main = do
putStrLn "Listening on http://localhost:8081"
run 8081 (serve (Proxy :: Proxy UserAPI) userAPI)
Servantのユーザ
- **Hasura GraphQL Engine** の内部サービス
- **Channable**、**Mercury Bank**、**Wire**
- 多数の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/scotty` — **Sinatra風マイクロフレームワーク**。短く軽いAPIを素早く立ち上げるのに向く。
{-# LANGUAGE OverloadedStrings #-}
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スタイル**:モナドトランスフォーマ(`StateT`・`ReaderT`・`ExceptT`)を積み上げる。強力だがエラーメッセージが長くなり、性能上のトレードオフも実在する。
2026年は **Effectful** がほぼ新標準になっている。
Effectful
`hackage.haskell.org/package/effectful` — Polysemy / fused-effects より単純なモデル、コンパイラに優しい性能、mtlに近い書き味。
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE GADTs #-}
-- エフェクト明示: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 effects** と **delimited continuations** を一級で扱う。GHC 9.10の新RTS機能を活用。
-- Bluefin風(概念例)
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 #-}
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で表現。
-- ユーザごとの投稿数
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 #-}
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 #-}
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 Options** — `fieldLabelModifier` で `snake_case` ↔ `camelCase` の変換が自然。
options :: Options
options = defaultOptions
{ fieldLabelModifier = camelTo2 '_' -- postId -> post_id
, omitNothingFields = True
}
13. テスト — hedgehog / tasty / hspec
Haskellのテスト生態系は3本柱。
hspec(BDD)
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-hspec`・`tasty-hedgehog`・`tasty-hunit` などのアダプタがある。
main :: IO ()
main = defaultMain $ testGroup "all"
[ testCase "trivial" $ (1 + 1) @?= (2 :: Int)
]
hedgehog(プロパティテスト)
QuickCheckの後継。目玉は **integrated shrinking** — 失敗例が自動で最小反例まで縮む。
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 #-}
main :: IO ()
main = do
x <- randn' [2, 3] -- Tensor [2, 3]
y <- randn' [3, 4]
let z = matmul x y
print z
Hasktorchが魅力的なのは **型でテンソル形状を表現できる** 点。
-- コンパイル時に形状を検証する行列積
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 Capital**、**HERP**、**Drivemode(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`
현재 단락 (1/460)
毎年誰かが訊く。「Haskell、まだ使ってるんですか?」