给定以下代码
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)
答案。