这是没有意义的,对于特定的数据类型,据我所知,您只能对bind
.
在 haskell 中,monad 是以下类型类,
instance Monad m where
return :: a -> m a
bind :: m a -> (a -> m b) -> m b
具体来说,对于我们有的列表 Monad,
instance Monad [] where
return :: a -> [] a
(>>=) :: [] a -> (a -> [] b) -> [] b
现在让我们考虑一个单子函数。
actOnList :: a -> [] b
....
一个用例来说明,
$ [1,2,3] >>= actOnList
在函数actOnList
中,我们看到列表是受另一种类型(此处[]
)的多态类型约束。然后,当我们谈论 list monad 的绑定运算符时,我们谈论的是由定义的绑定运算符[] a -> (a -> [] b) -> [] b
。
你想要实现的是一个bind
定义的运算符[] Maybe a -> (a -> [] b) -> [] b
,这不是第一个的专门版本,而是另一个函数,关于它的类型签名,我真的怀疑它可以是bind
任何类型的 monad 的运算符,因为你不返回你所拥有的消耗。你肯定会使用一个函数从一个 monad 转到另一个,但这个函数绝对不是bind
list 运算符的另一个版本。
这就是为什么我说,它没有意义,对于特定的数据类型,据我所知,你只能对bind
.