代码之家  ›  专栏  ›  技术社区  ›  Aron Lee

加入哈斯克尔的不同单子

  •  2
  • Aron Lee  · 技术社区  · 6 年前

    join [["dog"]] “输出 ["dog"]

    join $ (Just ["dog"]) 
    
    got error:
    Couldn't match type ‘[]’ with ‘Maybe’
    

    我们知道 Maybe [] 都是哈斯克尔的蒙纳德,

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

    也许 吧 是蒙纳德吗

    是蒙纳德吗

    怎么了?

    在我看来,只有同一类型的单子才能加入,

    fromJust (Just ["dog"]) 
    
    "output:  ["dog"]
    

    但我需要提前知道。

    1 回复  |  直到 6 年前
        1
  •  6
  •   Adam Smith    6 年前

    这个 m join :: Monad m => m (m a) -> m a 它出现的地方都是同一个单子。如果你有 Just (Just "dog") ,那么你有两个 Maybe monads和你的 join 会很好的工作。类似于您的列表示例。

    把东西从单子里拉出来是不可能一概而论的,这是单子力量的一部分。考虑一下如果你 能够

    Just ["dog"] -> ["dog"] ,你只需要一个 Maybe a -> a Data.Maybe.fromJust ,但是 maybe 更安全(如果你有呢 Nothing 而不是?)