我试图说服自己,List单子(使用平面列表、列表连接和元素映射)不是自由单子(确切地说,与某些函子T相关联的自由单子)。据我所知,我应该能通过以下步骤来实现:
首先在monad List中找到通常的运算符fmap、join等之间的关系,
然后证明这个关系在任何functor T的自由单子中都不成立,对于所有T。
List单子中存在一种奇特的关系,使得它与自由单子有所区别。如果我不知道T是什么,我该如何处理第二步?是否有其他策略可以显示出平面列表不是自由的?
作为一个副笔,为了消除任何术语冲突,让我注意一下:与一对函子相关联的自由单子是一个树单子(或嵌套列表单子),而不是平面List单子。
编辑:对于熟悉Haskell编程语言的人,问题可以这样表述:如何显示不存在functor T,使得List a = Free T a(对于所有T和monad同构)?
a
出现在Return
构造函数中,而不是Free
构造函数中。列表是内部标记的;它们沿着整个列表都有a
,而不仅仅在叶子节点上。 - Benjamin Hodgsontype Nat = Free Identity ()
吗?这是一个分支因子为1的树(因为Identity a
包含一个a
)。Free ((->) r)
是一个分支因子为r
的树,Free (Const Void)
是一个分支因子为0的树。等等。 - Benjamin Hodgson