[英]Define bind without join for the list monad in Haskell
我了解>>=
在join
的定义
xs >>= f = join (fmap f xs)
这也告诉我们fmap + join
产生>>=
我想知道List
Monad是否可以不使用join
进行定义,例如对Maybe
:
>>= m f = case m of
Nothing -> Nothing
Just x -> f x
当然。 GHC/Base.hs
的实际定义是根据等效列表理解的:
instance Monad [] where
xs >>= f = [y | x <- xs, y <- f x]
或者,您可以尝试使用以下方法从该类型从头开始进行计算:
(>>=) :: [a] -> (a -> [b]) -> [b]
我们需要处理两种情况:
[] >>= f = ???
(x:xs) >>= f = ???
首先很容易。 我们没有类型a
元素,因此不能应用f
。 我们唯一能做的就是返回一个空列表:
[] >>= f = []
对于第二个, x
是类型a
的值,因此我们可以应用f
给我们提供类型[b]
的fx
值。 这是我们列表的开始,我们可以将其与递归调用生成的列表的其余部分连接起来:
(x:xs) >>= f = f x ++ (xs >>= f)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.