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