在Haskell中为列表monad定义不带连接的绑定

时间:2018-02-18 00:54:42

标签: haskell monads

我理解>>=

join的定义
xs >>= f = join (fmap f xs)

还告诉我们fmap + join会产生>>=

我想知道对于List monad是否可以在没有join的情况下进行定义,就像我们为Maybe所做的那样:

>>= m f = case m of
    Nothing -> Nothing
    Just x  -> f x

1 个答案:

答案 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 = []

对于第二个,xa类型的值,因此我们可以应用f给我们f x类型[b]的值。这是我们列表的开头,我们可以将它与递归调用生成的列表的其余部分连接起来:

(x:xs) >>= f = f x ++ (xs >>= f)