【发布时间】:2013-06-06 17:33:06
【问题描述】:
According to the Haskell wikibook,一个名为m 的Monad 是一个带有两个额外操作的Functor:
unit :: a -> m a
join :: m (m a) -> m a
这很好,但我有一些不同的东西。忽略血淋淋的细节,我有一个具有良好 unit 和 join 功能的类型,但它的 fmap 表现不佳(fmap g . fmap f 不一定是 fmap (g.f))。因此,它不能成为Monad 的实例。尽管如此,我还是想给它尽可能多的通用功能。
所以我的问题是,什么类别的理论结构类似于单子,因为它们有 unit 和 join?
我意识到在某种程度上,上述问题定义不明确。对于 monad,unit 和 join 定义仅在 fmap 定义方面才有意义。如果没有fmap,您将无法定义任何单子定律,因此unit/join 的任何定义都将同样“有效”。所以我正在寻找除 fmap 之外的函数,在这些 unit 和 join 函数上定义一些“非单子”法则可能是有意义的。
【问题讨论】:
-
您能否详细描述一下您拥有的结构,特别是什么导致它无法满足
fmap的融合定律? -
我想你专门“调整”
fmap以使join满足第二个单子定律?通常,您几乎总是会自动获得fmap g . fmap f ≡ fmap $ f.g。 -
@luqui 我对一般情况更感兴趣,而不仅仅是这种特殊情况,但它是一个正态分布。如果您认为
fmap将函数应用于分布中的每个点,那么fmap只遵循Functor的加法和乘法定律。unit正在对单个数据点进行训练,join正在将“正态分布的正态分布”合并为单个正态分布。显然,这需要对参数进行一些限制,因此使用Base类型类根本无法完成,我一直在使用ConstraintKinds来玩弄它。 -
众所周知,“单子只是内函子范畴中的幺半群”。所以你正在寻找一个
monoid,只是在一个不同的类别中。我不确定哪个类别对应于正态分布,但我有点怀疑。我的直觉(通常是错误的 FWIW)是正态分布强加的唯一结构与 List 同构。 -
您的正常分发应用程序听起来与我尝试使用的 an uncertainty-propagation type 非常相似。我想我检查了它是否遵守函子定律,如果你用微分定律获得结果宽度!当然,当分布宽度保持足够小以至于您可以忽略高阶泰勒加法时;否则整个方法似乎并不是很有用。
标签: haskell monads category-theory