我正试图绕过F-algebras,而this article做得非常好。我理解双重类别理论的概念,但我很难理解F-coalgebras(F-代数的对偶)如何与Haskell中的惰性数据结构相关。
用具有以下函数的endofunctor描述F-代数:F a - > a,如果你将F a视为一个表达式,那么这是有意义的,而作为评估该表达式的结果,正如链接文章所解释的那样。作为F-代数的对偶,F-余代数的相应函数将是 - > F A。 Wikipedia说F-coalgebras可以用来创建无限的,懒惰的数据结构。 a - >如何?一个功能允许人们创建无限,懒惰的数据结构?另外,考虑到这一点,既然Haskell的核心是懒惰的,那么Haskell F-coalgebras中的大多数数据类型都是F-algebras? F-algebras没有被懒惰地评估?
如果数据类型(或至少 能够无限数据的数据类型)基于Haskell中的F-coalgebras,那么a - >例如,列表的功能?什么是列表的终端F-coalgebra?
在Haskell中创建无限列表[1,2,3,4 ...]可能看起来像这样:
list = 1 : map (+ 1) list
这是否以某种方式使用F-coalgebras?无限数据结构是否需要使用F-coalgebras进行惰性求值和递归的概念?我在这里错过了什么吗?
答案 0 :(得分:7)
代数A -> F A
可用于剥离(可能是无限的)数据结构的外层。对于X
的列表,仿函数为F a = Maybe (X, a)
,与代数视图中的相同。在haskell中,余代数的函数是
headView :: [a] -> Maybe (a, [a])
headView [] = Nothing
headView (x:xs) = Just (x,xs)
unfoldr
是对应于此代数的展开,就像foldr
是对应于此代数的折叠一样。
如果你认为[a]
不是列表类型,而是列表或程序的描述类型,那么这允许你构建(看似)无限值,只需要有限的描述。 / p>
如您所见,Haskell列表看起来像F代数和F-代数。这是可能的,因为Haskell实际上并不一致。您可以折叠展开,并获得无限循环。像coq和agda这样的语言区分了数据类型(F-代数)和codata类型(F-coalgebras)。在这些语言中,您有两种列表类型,代数List
和代数Colist
。