Skip to content

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

日本語
0%
정확도 0%
💡 왼쪽 원문을 읽으면서 오른쪽에 따라 써보세요. Tab 키로 힌트를 받을 수 있습니다.
원문 렌더가 준비되기 전까지 텍스트 가이드로 표시합니다.

プロローグ — 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、まだ使ってるんですか?」

작성 글자: 0원문 글자: 17,982작성 단락: 0/460