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

met*_*eto 1 monads haskell

我理解的>>=术语定义join

xs >>= f = join (fmap f xs)
Run Code Online (Sandbox Code Playgroud)

这也告诉我们fmap + join收益率>>=

我想知道对于Listmonad是否可以定义没有join,就像我们为例如Maybe:

>>= m f = case m of
    Nothing -> Nothing
    Just x  -> f x
Run Code Online (Sandbox Code Playgroud)

K. *_*uhr 6

当然.实际定义GHC/Base.hs是根据等效列表理解:

instance Monad []  where
    xs >>= f             = [y | x <- xs, y <- f x]
Run Code Online (Sandbox Code Playgroud)

或者,您可以尝试以下方法从头开始从类型中进行处理:

(>>=) :: [a] -> (a -> [b]) -> [b]
Run Code Online (Sandbox Code Playgroud)

我们需要处理两种情况:

[] >>= f = ???
(x:xs) >>= f = ???
Run Code Online (Sandbox Code Playgroud)

第一个很容易.我们没有类型的元素a,所以我们不能申请f.我们唯一能做的就是返回一个空列表:

[] >>= f = []
Run Code Online (Sandbox Code Playgroud)

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

(x:xs) >>= f = f x ++ (xs >>= f)
Run Code Online (Sandbox Code Playgroud)