
2025/12/31 13:07
選択的適応関数(Selective Applicative Functors)
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
本論文は、2019年にMokhovらによって導入された選択的適用ファンクタ(selective applicative functors)を再検討し、それらが排他的な決定論的選択を符号化していることを示す。実際には単なるファンクタではなく、アロー(プロファンクタ)のように振る舞う。
主な観察点
- 元の定義はモノイドテンソル(monoidal tensor)について言及しておらず、
操作がきれいに合成できないままだった。branch- 分岐で存在型(existential types)を導入し、それをプロファンクタ操作(
、first)やsecondインタフェースと結びつけることで、正しい合成が回復された。curry/lowerFn- コンストラクタ
、TwoCases、OneCase(ZeroCases内)の結合性・単位元・対称性・冪等性の法則は、CaseTree f i rのモノイドテンソル特性と鏡像を成す。Eitherコア構造
- 型クラス
とメソッドCasing fは、caseTreeOn :: f i -> CaseTree f i r -> f rとselect両方を一般化する。branch- 自由選択構造である
は、アクション、純粋関数、シーケンス、無意味ケース、および分岐(ControlFlow f i r)を結合し、強力なプロファンクタ操作(CaseBranch、first)とテンソルに関連するsecondインタフェースをサポートする。curry/lowerFn静的解析の視点
- データ型
は、純粋なASTライク構造を捉え、その操作はほぼセミリング(近似半環)を形成する:シーケンスが乗算、分岐が加算となる。FlowInfo f関係とスペクトル
- 選択的ファンクタは、代替(非決定論的選択の
)とモナド/適用ファンクタ(シーケンス対並列)の間に位置する。基底効果が冪等である場合(例:副作用を持たないパーサ)、選択的は代替から<|>とバックトラッキングを介して導出できる。mapMaybe将来の方向性
- 著者らは、構文、合成規則、および近似半環構造に基づく決定論的パースや静的解析といった実用的応用を探求する計画である。
この改訂要約は、主要項目リストからすべての重要点を忠実に反映しつつ、明確さを保ち、不必要な推論を避けています。
本文
選択的適用関数 – 簡潔な概要
1. 選択的適用関数とは何か?
選択的適用関数(Selective Applicatives)はモナドとアプリカティブの中間に位置します。
「有限で決定論的な選択」を可能にし、以前の結果が他方では静的に決まった制御フローのどちらを取るかを判断します。
このクラスは2019年に導入されました:
class Applicative f => Selective f where select :: f (Either a b) -> f (a -> b) -> f b
branch は select から派生できます:
branch :: Selective f => f (Either a b) -> f (a -> c) -> f (b -> c) -> f c branch x l r = fmap (fmap Left) x <*? fmap (fmap Right) l <*? r
select と branch の「クリーンなカテゴリカルな説明」を与えることが課題でした。
2. なぜアローなのか?
アプリカティブは「時間の矢印(arrow‑of‑time)」を持たず、効果を任意の順序で実行できます。
モナドはバインド演算子
(>>=) により動的制御フローをエンコードします。
選択的適用関数は 排他的な決定論的選択 を必要とし、これは自然にアロー(合成可能なプロファンクタ)で表現できます。
アローを使えば:
- 分岐構造 (
)、Either - 効果的な継続処理、
- それらのシーケンス
を捉えることができます。
3. コアデータ構造
CaseTree
CaseTreedata CaseTree f i r where TwoCases :: (i -> Either x y) -- 入力を分岐させる関数 -> CaseTree f x r -- 左の枝 -> CaseTree f y r -- 右の枝 -> CaseTree f i r OneCase :: f (i -> r) -- 単一の効果的ステップ -> CaseTree f i r ZeroCases:: (i -> Void) -- 空の枝 -> CaseTree f i r
CaseTree は「有限ケース関数」 i → f r の有限で存在量化された表現です。制御フローの AST として見ることができます。
Casing
Casingclass Casing f where caseTreeOn :: forall i r. f i -> CaseTree f i r -> f r
Casing のインスタンスは、与えられた CaseTree に従って f 内の値を解釈します。
ControlFlow
ControlFlowフリーな選択的適用関数:
data ControlFlow f i r where Action :: f (i -> r) -> ControlFlow f i r Pure :: (i -> r) -> ControlFlow f i r Sequencing :: ControlFlow f i j -> ControlFlow f j r -> ControlFlow f i r -- 分岐はそれ自身が `ControlFlow` である `CaseTree` CaseBranch :: (i -> Either x y) -> ControlFlow f x r -> ControlFlow f y r -> ControlFlow f i r
Sequencing コンストラクタはモナド的合成を、CaseBranch コンストラクタは選択的選択を表します。
4. 法則
| 操作 | 法則 |
|---|---|
乗法 () | 結合律: 。単位元: 。 |
加法 (/) | 結合律: 。単位元: 、。 |
| 分配 | 右分配律: 。 |
| オプション | 分岐の可換性: 。冪等律: (効果が同一の場合)。 |
これらの法則は、定数関数でインスタンス化したときに「近似セミリング」を形成します。
5. 選択的から代替へ
Alternative は非決定論的選択を提供します:
class Applicative f => Alternative f where (<|>) :: f a -> f a -> f a
Filterable と Plus を併用すれば、選択的振る舞いを再現できます:
selectLeft = mapMaybe (\case Left x -> Just x; Right _ -> Nothing) selectRight = mapMaybe (\case Left _ -> Nothing; Right y -> Just y) branch d l r = liftA2 (&) (selectLeft d) l <|> liftA2 (&) (selectRight d) r
したがって、決定論的な選択 は 非決定論的代替 とフィルタリングでシミュレートできます。
しかし、
CaseTree の静的構造は解析や曖昧さの防止に有用です。
6. 要約
- 選択的適用関数は有限かつ決定論的な分岐をエンコードします。
- コアは アロー(
,CaseTree
)で表現されます。ControlFlow - 法則は「近似セミリング」―乗法と加法の構造、右側の分配律を備えています。
- 代替 (
) とフィルタリングで選択的振る舞いを模倣できますが、本来の<|>
の完全な力はアロー表現に集約されます。select
この枠組みは、アプリカティブ・モナド・セレクティブ・オルターナティブの制御フロー推論を統一し、静的解析と合成プログラミングのための明確な代数的基盤を提供します。