在 Haskell 中加入不同的单子

join for different monads in Haskell

我知道我可以使用 join 删除第一级列表

join [["dog"]]”输出["dog"]

但为什么以下内容不起作用

join $ (Just ["dog"]) 

got error:
Couldn't match type ‘[]’ with ‘Maybe’

我们知道 Maybe[] 都是 Haskell,

中的 Monad
join(Monad m)=> m(m a) -> m a

Maybe 是 Monad

[] 是 Monad

这有什么问题?

在我看来只为同一类型的Monad加入, 如有错误请指正

对于像我上面给出的示例那样的任何 Monad,是否有任何类似于 join 的函数?

我知道我可以按照下面的方式做

fromJust (Just ["dog"]) 

"output:  ["dog"]

但我需要提前知道。

join :: Monad m => m (m a) -> m a 中的 m 在所有出现的地方都是同一个 Monad。如果你有 Just (Just "dog"),那么你有两个 Maybe monad,你的 join 将完美地工作。类似于您的列表示例。

从 Monad 中提取内容不能一概而论,这是 Monad 强大功能的一部分。考虑一下,如果你 可以 这样做,那么剥离 IO Monad 的类型安全性将是微不足道的!

要从 Just ["dog"] -> ["dog"] 开始,您只需要一个 Maybe a -> a 您可以使用 Data.Maybe.fromJust,但是 maybe 更安全(如果您有 Nothing相反?)