在 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
相反?)
我知道我可以使用 join 删除第一级列表
join [["dog"]]
”输出["dog"]
但为什么以下内容不起作用
join $ (Just ["dog"])
got error:
Couldn't match type ‘[]’ with ‘Maybe’
我们知道 Maybe
和 []
都是 Haskell,
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
相反?)