![](/img/trans.png)
[英]Is Haskell's `Const` Functor analogous to the constant functor from category theory?
[英]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
类中的对象是类型,而不是它们的实例。
在该图中,两个箭头( join
和fmap join
)都导致M(M(X))
。 这是同一个对象,还是有两个不同的M(M(X))
?
我对这个例子使用类型的实例而不是类型的事实感到困惑。 因为Hask类中的对象是类型,而不是它们的实例。
该示例使用类的实例, 该类本身就是一个类型 。
在Haskell中,是的,这是同一个对象(类型)。 Monad
类型类的实例必须是类型构造函数,类型构造函数是单射的。 那么,应该很清楚
X = X => M(X) = M(X) => M(M(X)) = M(M(X))
这里的问题是,这只意味着它们是相同的类型,而不是价值。 仅仅因为fmap join
和join
都可以将它们的类型专门用于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 join
和join
产生相同类型的 不同值。 因此,它们是不相同的,即使它们与组合物 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. join
, fmap join == join
是不正确的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.