我可以通过映射 ( , ) 或折叠 ( , ) 另一个可遍历的数据结构来构建作为类型类成员的数据结构Traversable
(例如List
or )。Map
map
mapM
foldl
foldM
但是,我经常遇到需要使用类型类的成员Num
(例如Integer
)构建可遍历的数据结构的情况。
我通常的方法是使用递归操作来构建一个列表——例如:
foo :: Integer -> [Integer] -> [Integer]
foo n fs
| m < 2 = fs
| rem m 2 == 0 = foo (m - 1) (m:fs)
| otherwise = foo (m - 1) fs
where m = abs n
此函数返回可被 2 整除且介于 2 和 n(含)之间的整数的绝对值。
使用上面的示例,是否有一种惯用的方法可以在不使用递归的情况下从不可遍历的列表中构建列表?