haskellプログラミング言語では、一連の例を示し、次にcatamorphismsに対するよりグローバルなアプローチを示します。
IterationEdit
反復ステップ処方は、初期オブジェクトとして自然数につながります。
ファンクタを考えてみましょうfmaybe
b
fmaybe b
b
b
(haskellでは、これはMaybe
が行うことです)。 これは、1つの項と1つの関数を使用して符号化できます。 したがって、StepAlgebraのインスタンスには、fmaybe b
b
Nothing
nil
b
b
b
b
b
b
next
と呼ばれます。
List foldededit
固定型a
b
Nil
を追加します。 F代数は、Nil
nil
b
b
a -> b -> b
の関数としてエンコードできます。
Tree foldededit
固定型a
の場合、functorマッピング型b
a
b
b
b
の(タイプb
b
a
b
a -> b
respの二つの関数としてエンコードすることができます。 b -> b -> b
。初期代数のより深い圏理論的研究は、関手をそれ自身の初期代数に適用することから得られたF-代数がそれに同型であることを明らかにする。
General caseEdit
強い型システムにより、ファンクタf
の初期代数を固定小数点a=f aとして抽象的に指定することができます。 再帰的に定義されたカタモルフィズムは、(上記の異なる例のように)ケース分析がfmapによってカプセル化される単一行でコード化することができます。 後者のドメインはf
a
f a
の間で前後にジャンプします。
ここでも最初の例ですが、Maybe functorをFixに渡すことで修正できます。 Maybe関手の繰り返し適用は型の連鎖を生成するが、これは固定小数点定理からの同型写像によって統一することができる。 私たちは、MaybesのNothing
zero
Just
を繰り返し適用して後継関数を特定します。 このようにして自然数が発生します。
そして今、再びツリーの例。 このためには、ツリーコンテナのデータ型を指定して、fmap
Maybe
ファンクタでは、標準のpreludeの一部であるため、これを行う必要はありませんでした)。/div>
data Tcon a b = TconL a | TconR b binstance Functor (Tcon a) where fmap f (TconL x) = TconL x fmap f (TconR y z) = TconR (f y) (f z)
type Tree a = Fix (Tcon a) -- the initial algebraend :: a -> Tree aend = Iso . TconLmeet :: Tree a -> Tree a -> Tree ameet l r = Iso $ TconR l r
treeDepth :: Algebra (Tcon a) Integer -- again, the treeDepth f-algebra exampletreeDepth (TconL x) = 1treeDepth (TconR y z) = 1 + max y z
以下は4に評価されます。cata treeDepth $ meet (end "X") (meet (meet (end "YXX") (end "YXY")) (end "YY"))