Haskell绑定运算符如何从monad中提取值



如果这个问题听起来很傻,请原谅,我还是学习Haskell的初学者。

给定绑定运算符函数签名:

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

我的问题是;a";值从";m a";以便函数CCD_ 1可以被激发?haskell内部对此进行了抽象吗?

这是由编写特定类型的Monad实例的人员实现的。

例如,如果我们查看MaybeMonadinstance,我们会看到[src]:

-- | @since 2.01
instance  Monad Maybe  where
(Just x) >>= k      = k x
Nothing  >>= _      = Nothing
(>>) = (*>)

而对于列表[src]的一个实例,我们看到:

-- See Note: [List comprehensions and inlining]
-- | @since 2.01
instance Monad []  where
{-# INLINE (>>=) #-}
xs >>= f             = [y | x <- xs, y <- f x]
{-# INLINE (>>) #-}
(>>) = (*>)

如果您因此使某个东西成为Monad类型类的实例,则需要提供(>>=)函数的实现。

最新更新