我理解>>=
join
的定义
xs >>= f = join (fmap f xs)
还告诉我们fmap + join
会产生>>=
我想知道对于List
monad是否可以在没有join
的情况下进行定义,就像我们为Maybe
所做的那样:
>>= m f = case m of
Nothing -> Nothing
Just x -> f x
答案 0 :(得分:6)
不确定。 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
给我们f x
类型[b]
的值。这是我们列表的开头,我们可以将它与递归调用生成的列表的其余部分连接起来:
(x:xs) >>= f = f x ++ (xs >>= f)