【发布时间】:2012-11-27 15:57:15
【问题描述】:
最近我正在尝试使用 Foldr 解决一个问题。任务如下:
In:[5,1,3,8,2,4,7,1]
Out:[16,8]
这意味着,我会将输入列表中位于奇数索引位置和偶数位的元素加倍。我在没有使用 foldr 的情况下编写了程序,如下所示:(它显示模式匹配失败:head[])
findPos list elt =
map fst $ filter ((elt==).snd) $ zip [0..] list
doublePos [] = []
doublePos (x:xs)
| ((head(findPos xs x)`mod` 2) /= 0) && (x `mod` 2 == 0) =
[2*x] ++ doublePos xs
| otherwise = doublePos xs
如何使用 foldr 编写这个程序?
【问题讨论】:
-
这是一个奇怪的任务......这不是家庭作业,对吧?说真的,用
foldr这样做只会让它变得难以理解而没有任何好处。我只是一步一步地做:删除偶数索引元素,删除奇数条目,将剩余值加倍,完成。map(*2) . filter even . remAtEvenPoswhere remAtEvenPos(a:b:l) = a:l; remAtEvenPos l = l。这就是惯用的 Haskell 解决方案。 -
@leftaroundabout thnx 为您提供建议。但作为初学者,我尝试使用 foldr 解决问题。
-
@leftaroundabout,你的意思是
remAtEvenPos (a:_:l) = a : remAtEvenPos l? -
@dbaupp:当然有,不过现在编辑太晚了……
标签: haskell