在 haskell 中使用 foldl 实现递归



给定以下代码

pair :: [String] -> [(String,String)]
pair [] = []
pair (x:xs)= zip [x] xs ++ pair xs

如何使用 Fold 重写它以避免重复?

对于

这个特定问题,折叠会有点混乱,因为您的折叠函数依赖于列表中以前访问过的元素,最小值为两个值列表。由于折叠一次访问一个元素,因此您必须决定当列表中只有一个元素时该怎么做。

下面是一个示例,该示例为单一实例列表案例创建一个虚拟元素,并使用 init 将其丢弃。

pair :: [String] -> [(String, String)]
pair = init . foldr f []
  where
    f x acc =
      case acc of
        [] -> [(x, "discarded")]
        z@(y:_) -> (x, fst y) : z

如果你的任务是学习折叠,花点时间理解为什么我们必须以如此不令人满意的方式处理它。否则,如果您希望以最少的代码执行此操作,请参阅@DavideSpataro上面的zip xs (tail xs)答案。

最新更新