当转换器函数中需要给定项目的位置(索引或路径)时,使用哪一个是合适的态射(递归方案)?
一个简单的示例是将列表["foo", "bar", "qux"]
转换为字符串"foo, bar, and qux"
。需要当前元素的位置来知道何时插入and
.
当转换器函数中需要给定项目的位置(索引或路径)时,使用哪一个是合适的态射(递归方案)?
一个简单的示例是将列表["foo", "bar", "qux"]
转换为字符串"foo, bar, and qux"
。需要当前元素的位置来知道何时插入and
.
您需要使索引成为结构的一部分,以便递归方案可以使用它。一种特别的方法是定义一个foldWithIndex
函数:
foldWithIndex :: (Foldable t, Num i) => (i -> a -> b -> b) -> b -> t a -> b
foldWithIndex f z t = snd $ foldr f' (0, z) t
where
f' z (i, x) = (i + 1, f i z x)
此函数采用一个运算符来组合还考虑索引的元素:
foldWithIndex combine "" ["foo", "bar", "qux"]
where
combine 0 s1 s2 = s1 ++ s2
combine 1 s1 s2 = s1 ++ " and " ++ s2
combine _ s1 s2 = s1 ++ ", " ++ s2
结果"foo, bar and qux"
。
有关更通用的方法,请参阅Data.Foldable.WithIndex
,它提供了一个可折叠的类型类,该类型类也将索引考虑在内。