【问题标题】:Are join and return the inverse of each other?加入和返回是否相互相反?
【发布时间】:2019-07-23 17:05:24
【问题描述】:

https://en.m.wikibooks.org/wiki/Haskell/Category_theory

join :: Monad m => m (m a) -> m a
join x = x >>= id

id 是类别 Hask 上的恒等函子吗?id 是否有类型 a-> a

>>=要求它的第二个参数的类型是a->ma,如果id的类型是a-> a,那么id怎么能作为>>=的第二个参数呢?

return 的类型为 a -> majoinreturn 是互逆吗?

谢谢。

【问题讨论】:

  • 小心你的空白; a -> m aa -> ma 是两种完全不同的类型。
  • id 是身份function in Haskdata Identity a = Identity a 是身份 functor on Hask
  • 谢谢。 (1)m ama有什么区别? (2) Hask中的“恒等函数”和Hask中的“恒等函数”有什么区别? (3) data Identity a = Identity a 是否定义了一个类型 Identity,它有一个构造函数,也称为 Identity,并由类型变量 a 参数化?这如何意味着它是 Hask 上的恒等函子?
  • 1) a -> ma 只是 a -> b 使用不同的名称。在a -> m a 中,m 具有类型* -> *,因此必须将其应用于其他类型才能提供有效的返回类型。 2)一个是函数,另一个是函子。 3) Identity 实际上只是一个非常简单的类型构造函数。它的仿函数实例同样简单:instance Functor Identity where fmap f (Identity x) = Identity (f x)Identity 本身并不是很有用,但它可以作为 monad 堆栈之类的有用基础(因为 Identity 也是一个基本的 monad)。
  • (例如,以前直接定义data State s a = ... 之类的东西,现在将其定义为应用于Identity monad 的StateT monad 转换器。)

标签: haskell monads


【解决方案1】:

>>=要求它的第二个参数的类型是a->ma,如果id的类型是a-> a,那么id怎么能作为>>=的第二个参数呢?

不,>>= 要求其第二个参数的类型为 a -> m bb 不一定等于 a。在您提到的情况下,我们选择了a = m b,以便

(>>=) :: m (m b) -> (m b -> m b) -> m b

id 然后可以作为m b -> m b 类型的第二个参数传递。

return 的类型为 a -> majoinreturn 是互逆吗?

不是真的,因为我们没有join :: m a -> a

不过,如果我们考虑特殊情况 a = m b,那么

return :: m b -> m (m b)
join   :: m (m b) -> m b

我们确实有join . return = id

即使在那种特殊情况下,我们仍然没有return . join = id,例如在列表单子中:

return (join [[1],[2]]) = return [1,2] = [[1,2]]

【讨论】:

  • 谢谢。 join 的类型为 m (m a) -> m a。这与ma -> a 有何不同?
  • @Tim 例如,在 list monad 中,您可以将 join 应用于列表列表,但不能应用于非列表列表。 join [True] 是类型错误。
  • 这实际上是关于 monad 的一个非常基本的观点。它们允许您在 monad 中嵌入任意值(使用 return)并在嵌套的 monad 中展平外层(即 join),但一般来说,no 方法是“从单子中删除”一个项目。 (>>=,它只是 fmapjoin 的组合,确实可以让您假装访问内部的值,但前提是您将它​​们提供给返回单子值的函数。)这实际上非常重要IO的情况,如果有函数IO a -> a,Haskell的纯度就会被破坏。
  • @RobinZigmond,我想知道解析器是否提供了一个更好的例子:Parser a -> a 对于来自命令式背景的人来说可能更明显是荒谬的。
  • @Tim 两者都具有[[Int]] 类型(为简单起见假设为整数)。这里m=[]b=Int。它们是同一类型的不同值。
猜你喜欢
  • 1970-01-01
  • 2011-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-04
  • 1970-01-01
相关资源
最近更新 更多