【问题标题】:Define bind without join for the list monad in Haskell为 Haskell 中的列表单子定义无连接绑定
【发布时间】:2018-02-18 00:54:41
【问题描述】:

我理解>>=join方面的定义

xs >>= f = join (fmap f xs)

这也告诉我们fmap + join 产生>>=

我想知道对于 List monad 是否可以在没有 join 的情况下进行定义,就像我们对 Maybe 所做的那样:

>>= m f = case m of
    Nothing -> Nothing
    Just x  -> f x

【问题讨论】:

    标签: haskell monads


    【解决方案1】:

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

    instance Monad []  where
        xs >>= f             = [y | x <- xs, y <- f x]
    

    或者,您可以尝试以下方法从类型中从头开始计算:

    (>>=) :: [a] -> (a -> [b]) -> [b]
    

    我们需要处理两种情况:

    [] >>= f = ???
    (x:xs) >>= f = ???
    

    第一个很简单。我们没有a 类型的元素,所以我们不能应用f。我们唯一能做的就是返回一个空列表:

    [] >>= f = []
    

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

    (x:xs) >>= f = f x ++ (xs >>= f)
    

    【讨论】:

    • 这和in the Reasoned Schemer给出的完全一样! (仅在 Scheme 中;从未提及“M”字)。他们甚至在那里有两个不同的“绑定”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-09
    相关资源
    最近更新 更多