阅读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吗?
答案 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
获取一个列表列表,并返回一个列表,其中包含原始列表列表中每个列表中的每个值。