【发布时间】: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 -> ma。
join 和 return 是互逆吗?
谢谢。
【问题讨论】:
-
小心你的空白;
a -> m a和a -> ma是两种完全不同的类型。 -
id是身份function in Hask;data Identity a = Identity a是身份 functor on Hask。 -
谢谢。 (1)
m a和ma有什么区别? (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 = ...之类的东西,现在将其定义为应用于Identitymonad 的StateTmonad 转换器。)