关于Haskell列表monoid实现

时间:2019-02-26 23:12:46

标签: haskell

阅读Haskell Monoid源代码,我明白了,

instance Monoid [a] where
        {-# INLINE mempty #-}
        mempty  = []
        {-# INLINE mconcat #-}
        mconcat xss = **[x | xs <- xss, x <- xs]**

我不明白 xss ,什么是xss?并且列表生成器部分也令人困惑,xs <-xss,怎么来的?

更新:

列表理解很容易理解,但是看看代码,xss,xs,x,三个符号之间的关系是什么,为什么xs <-xss?我可以写xss <-xsss吗?

1 个答案:

答案 0 :(得分:6)

就像任何Haskell问题一样,我们应该从查看类型开始。我们有mconcat :: Monoid m => [m] -> m,这意味着要为[a]定义Monoid实例,我们需要一个函数,该函数需要一个列表列表并返回一个列表,即mconcat :: [[a]] -> [a]。因此,xss是列表的列表。表达式[x | xs <- xss, x <- xs]是一个列表推导。通过从列表xs中选择每个可能的列表xxs,然后依次从列表x中选择每个元素xs,可以构造一个列表。输出列表包含所有可能的值x。从本质上讲,这意味着mconcat获取一个列表列表,并返回一个列表,其中包含原始列表列表中每个列表中的每个值。