Haskell 它';它不是单子,但它是什么?

Haskell 它';它不是单子,但它是什么?,haskell,monads,category-theory,Haskell,Monads,Category Theory,,一个名为m的Monad是一个带有两个附加操作的函子: unit :: a -> m a join :: m (m a) -> m a 那很好,但我有点不同。掩盖血淋淋的细节,我有一种类型,它有很好的unit和join功能,但它的fmap表现不好(fmap g.fmap f不一定是fmap(g.f))。因此,它不能成为Monad的实例。尽管如此,我还是想给它尽可能多的通用功能 所以我的问题是,哪些范畴理论结构与单子相似,因为它们有一个单元和连接 我意识到,在某种程度上,上述问题是不

,一个名为
m
Monad
是一个带有两个附加操作的
函子

unit :: a -> m a
join :: m (m a) -> m a
那很好,但我有点不同。掩盖血淋淋的细节,我有一种类型,它有很好的
unit
join
功能,但它的
fmap
表现不好(
fmap g.fmap f
不一定是
fmap(g.f)
)。因此,它不能成为
Monad
的实例。尽管如此,我还是想给它尽可能多的通用功能

所以我的问题是,哪些范畴理论结构与单子相似,因为它们有一个
单元
连接


我意识到,在某种程度上,上述问题是不明确的。对于单子,
unit
join
定义仅在
fmap
定义方面有意义。如果没有
fmap
,就无法定义任何monad定律,因此
unit
/
join
的任何定义都同样“有效”。因此,我正在寻找除
fmap
之外的函数,以便定义一些“非monad”可能是有意义的关于这些
单元
连接
函数的定律。

好吧,这里有一条定律,你只需要
单元
连接
。给定
x::ma

join (unit x) = x

为了证明这并非无中生有,让我们从现有的单子定律开始:

return x >>= f = f x
假设
m>>=f=join(fmap fm)

选择
f=id

join (fmap id (return x)) = id x
join (id (return x)) = id x
使用
fmap id=id

join (fmap id (return x)) = id x
join (id (return x)) = id x
使用明显的
id a=a

join (return x) = x

你能更详细地描述一下你的结构吗?是什么特别导致它不符合
fmap
的融合法则?我想你特别“调整”了
fmap
,使
join
符合第二个单子法则?通常,您几乎总是得到
fmap g。fmap f≡ fmap$f.g
只是自动生成的。@luqui我对一般情况比对具体情况更感兴趣,但这是一个正态分布。如果您认为
fmap
是将函数应用于分布中的每个点,那么
fmap
只遵守
函子的加法和乘法定律
unit
在单个数据点上进行训练,
join
将“正态分布的正态分布”合并为单个正态分布。显然,这需要对参数进行一些约束,因此根本无法使用
Base
类型类来完成,我一直在使用
ConstraintKinds
来处理它。正如众所周知的那样,“monad只是内函子范畴中的monoid”。所以您正在寻找一个
幺半群
,只是在另一个类别中。我不确定哪一类符合正态分布,但我有点怀疑。我的直觉(通常是错误的FWIW)是正态分布施加的唯一结构与列表同构。您的正态分布应用程序听起来与我尝试的非常相似。我想我检查过它是否遵守函子定律,如果你用微分定律得到结果宽度!当然,当分布宽度足够小,可以忽略高阶泰勒和;否则,整个方法似乎并不十分有用。