1

当转换器函数中需要给定项目的位置(索引或路径)时,使用哪一个是合适的态射(递归方案)?

一个简单的示例是将列表["foo", "bar", "qux"]转换为字符串"foo, bar, and qux"。需要当前元素的位置来知道何时插入and.

4

1 回答 1

1

您需要使索引成为结构的一部分,以便递归方案可以使用它。一种特别的方法是定义一个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,它提供了一个可折叠的类型类,该类型类也将索引考虑在内。

于 2021-03-17T11:04:09.523 回答