在嵌套的Haskell映射中需要concatMap

时间:2014-11-09 18:40:34

标签: haskell

我不明白为什么在这需要concatMap而不是简单的map:

expand :: [[Int]] -> [[Int]]

expand xs = concatMap (\a -> (map (\b -> a++b) [[1],[2],[3]])) xs

不要a和b各自只在它们各自的任务中选择一个简单的列表,那么作为这些列表的串联的++ b应该只是另一个列表吗?

欣赏一些见解......

1 个答案:

答案 0 :(得分:1)

map保留输入列表中的元素数量,因此您不仅可以使用它,因为您要在输出中为输入列表中的每个列表创建三个元素。 concatMap允许您通过返回要合并到输出列表中的列表来执行此操作。内部地图为输入列表创建了这三个列表,但由于它返回了每个输入列表的列表列表,因此您需要删除额外的嵌套层。