繁体   English   中英

Haskell中的`join`和`fmap join`是否等于(从类别理论的角度来看)?

[英]Are `join` and `fmap join` equals in Haskell (from Category theory point of view)?

我的问题来自Haskell的monad的第一定律: join . fmap join = join . join join . fmap join = join . join join . fmap join = join . join

Haskell / Category_theory中,该法律由以下图片证明:

在此输入图像描述

我对这个例子使用类型的实例而不是类型的事实感到困惑。 因为Hask类中的对象是类型,而不是它们的实例。

所以我尝试用类型重绘这个例子,这里我得到了: 在此输入图像描述

在该图中,两个箭头( joinfmap join )都导致M(M(X)) 这是同一个对象,还是有两个不同的M(M(X))

我对这个例子使用类型的实例而不是类型的事实感到困惑。 因为Hask类中的对象是类型,而不是它们的实例。

该示例使用的实例, 该类本身就是一个类型


在Haskell中,是的,这是同一个对象(类型)。 Monad类型类的实例必须是类型构造函数,类型构造函数是单射的。 那么,应该很清楚

X = X   =>   M(X) = M(X)   =>   M(M(X)) = M(M(X))

这里的问题是,这只意味着它们是相同的类型,而不是价值。 仅仅因为fmap joinjoin都可以将它们的类型专门用于Monad m => m (m (ma)) -> m (ma)并不意味着它们做同样的事情。

他们没有。

ghci> (fmap join) [[[1],[2],[3]]]
[[1,2,3]]         
ghci> join [[[1],[2],[3]]]
[[1],[2],[3]]

并非所有类别的图纸都必须最终成为通勤图。 :)

从图片中,您可以看到fmap joinjoin产生相同类型的 不同值。 因此,它们是不相同的,即使它们与组合物 join最终产生相同的值。

在范畴论中,同态是一种态射g ,使得f1 . g == f2 . g f1 . g == f2 . g f1 . g == f2 . g意味着f1 == f2也是如此。 在这种情况下,我们可以看到join 不是一个异形,因为虽然fmap join . join == join. join fmap join . join == join. join fmap join . join == join. joinfmap join == join是不正确的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM