当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《Haskell中的`join`和`fmapjoin`是否等于(从类别理论的角度来看)?》经验,为你挑选了2个好方法。

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

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

在此输入图像描述

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

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

在这张照片中,两个箭头(joinfmap join)通向M(M(X)).这是同一个对象,还是有两个不同M(M(X))



1> Alec..:

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

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


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

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

这里的问题是,这只意味着它们是相同的类型,而不是价值.只是因为fmap join并且join可以将它们的类型专门化Monad m => m (m (m a)) -> m (m a)并不意味着它们做同样的事情.

他们没有.

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

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



2> chepner..:

从图片中,您可以看到fmap joinjoin生成相同类型的不同值.因此,它们是不一样的,尽管它们的组合物与最终产生相同的值.join

在范畴理论中,同形异形是一种态射g,这也f1 . g == f2 . g暗示了这f1 == f2一点.在这种情况下,我们可以看到,join不是一个满射,因为虽然fmap join . join == join. join,这是不正确的fmap join == join.

推荐阅读
牛尾巴2010
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有