给出以下代码
pair :: [String] -> [(String,String)]
pair [] = []
pair (x:xs)= zip [x] xs ++ pair xs
我怎么能用Fold重写它以避免重复?
答案 0 :(得分:1)
对于这个特殊问题,折叠会有点混乱,因为折叠函数取决于列表中先前访问过的元素,最小值为两个值。由于折叠访问元素一次一个,所以当列表中只有一个元素时,你必须决定该做什么。
这是一个为单例列表案例创建虚拟元素并使用init
丢弃它的示例。
pair :: [String] -> [(String, String)]
pair = init . foldr f []
where
f x acc =
case acc of
[] -> [(x, "discarded")]
z@(y:_) -> (x, fst y) : z
如果你的任务是学习折叠,请花一点时间来理解为什么我们必须以这种令人不满意的方式处理它。否则,如果您希望用最少量的代码执行此操作,请参阅@ zip xs (tail xs)
上方@ DavideSpataro的答案。