join [["dog"]] “输出 ["dog"]
join [["dog"]]
["dog"]
join $ (Just ["dog"]) got error: Couldn't match type â[]â with âMaybeâ
我们知道 Maybe 和 [] 都是哈斯克尔的蒙纳德,
Maybe
[]
join(Monad m)=> m(m a) -> m a
也许 吧 是蒙纳德吗
也许 吧
是蒙纳德吗
怎么了?
在我看来,只有同一类型的单子才能加入,
fromJust (Just ["dog"]) "output: ["dog"]
但我需要提前知道。
这个 m join :: Monad m => m (m a) -> m a 它出现的地方都是同一个单子。如果你有 Just (Just "dog") ,那么你有两个 Maybe monads和你的 join 会很好的工作。类似于您的列表示例。
m
join :: Monad m => m (m a) -> m a
Just (Just "dog")
join
把东西从单子里拉出来是不可能一概而论的,这是单子力量的一部分。考虑一下如果你 能够
从 Just ["dog"] -> ["dog"] ,你只需要一个 Maybe a -> a Data.Maybe.fromJust ,但是 maybe 更安全(如果你有呢 Nothing 而不是?)
Just ["dog"] -> ["dog"]
Maybe a -> a
Data.Maybe.fromJust
maybe
Nothing