【发布时间】:2020-12-21 16:58:07
【问题描述】:
我可以通过映射(map、mapM)或折叠(foldl、@987654327)来构建属于Traversable 类型类(例如List 或Map)的数据结构@) 另一个可遍历的数据结构。
但是,我经常遇到需要使用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(含)之间的整数的绝对值。
使用上面的示例,是否有一种惯用的方法可以在不使用递归的情况下从不可遍历的列表中构建列表?
【问题讨论】:
-
这里的目标到底是什么?是在不使用递归的情况下重写您的
foo函数吗?你能用英语解释一下foo函数应该做什么吗? -
foldr可以为可折叠数据结构生成丢失。例如,在任意Foldable数据结构上执行toList的简单方法是foldr (:) []。 -
@Aplet123 总的来说,我想了解如何在不使用递归的情况下解决这类问题,以此为例——但是,这里的目标也是重写特定的示例函数
foo。将更新问题以解释该功能的作用。 -
这个特定的函数可以非递归地写成
\n fs -> [2,4..n] ++ fs,但是在不知道函数做什么的情况下,无法对某个通用函数执行这样的转换。对于不那么琐碎的函数,使它们成为非递归的可能会更困难。
标签: haskell recursion enums traversable