Map,每个输入元素可以对应多个输出元素

时间:2015-10-25 19:52:32

标签: list haskell monads

作为haskell的新手,我想知道更有效的方法是:

mapmulti :: (a -> [b]) -> [a] -> [b]
mapmulti fn list = concat $ map fn list

我的列表将长达数千到数百万个元素,创建一个N列表列表只是为了将它们连接在一起似乎是一种耻辱。

替代地并且优选地,是否存在一些更通用(可能是monadic)的方式使得haskell从函数的结果逐步地创建列表,使得列表被逐步构建而不创建O(n)大小的递归表达式树评估?

1 个答案:

答案 0 :(得分:6)

只需使用

mapmulti = concatMap

来自图书馆。

此外,即使使用您自己的实现,编译器也许可以使用称为“砍伐森林”的技术来优化中间列表。

即使没有这样做,在运行时中间列表也不会在消耗之前完全生成,因为Haskell是懒惰的。相反,将生成一个列表元素并立即使用,使其在生成下一个列表元素之前可用于垃圾收集。这将大大改善内存占用,因为一切都可以在恒定的空间内完成。