关于Haskell列表monoid实现

Sof*_*dom -2 haskell

阅读Haskell Monoid源代码,我看到了,

instance Monoid [a] where
        {-# INLINE mempty #-}
        mempty  = []
        {-# INLINE mconcat #-}
        mconcat xss = **[x | xs <- xss, x <- xs]**
Run Code Online (Sandbox Code Playgroud)

我不明白xss,什么是xss?和列表生成器部分也很混乱,xs < - xss,怎么来的?

更新:

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

trp*_*pnd 6

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

  • @SoftwareWisdom - 正如@ 4castle上面所说,它只是一个命名约定,它们可能是任何东西.但是`x`是'a`类型的元素,`xs`是`a`s的列表,'xss`是`a`s的列表列表,所以约定提醒你结构. (2认同)