Haskell - 以不同方式映射奇数放置值和偶数放置值

Abs*_*act 5 mapping haskell

有一个简单的方法.要取一个数字列表,比如说123456.然后将奇数放三乘,偶数乘1.

即(1*3)+(2*1)+(3*3)+(4*1)+(5*3)+(6*1)

我正在考虑地图功能的某些地方.但我不知道如何将*3映射到奇数放置的值.哦,如果你能给我一个不是前奏的版本,就像实际的函数或函数一样好,就好像它是从外部haskell文件导入的

谢谢您的帮助

yat*_*975 14

好吧,正如我之前在评论中写的那样,zipWith (*) (cycle [3,1]) xs是你在寻找什么.但首先,一个小挑剔:列表的头部我会称之为第0个元素,这就是为什么我已经改变了1和3的原因:-)

我们来看一个简单的例子; 让xs[9,8,7,3,2].cycle [3,1]只是一遍又一遍地重复它的论点,这将是一个以[3,1,3,1,3,1,...]开头的无限列表.什么zipWith f xs ys确实是采取的头元件xs和头元件ys和应用f(其应该是两个参数的函数),以这些元素-的结果f接着前进到的结果的前zipWith.如果x或y中的一个变空,我们就完成了; 否则我们继续前进.

所以结果的第一个元素会(3 * 9),然后(1 * 8),(3 * 7),(1 * 3),(3 * 2)我们就大功告成了!

你可以看看zipWith 这里的定义.

如果你真的不想使用预定义函数,你可以定义一个'交替映射',它取两个函数而不是一个函数,将第一个函数应用到参数列表的头部并在递归调用上切换函数.我会让你弄清楚那里的细节......

  • yatima2975:`pointFreeSol = zipWith(*)(cycle [3,1])` (4认同)

Tho*_*son 0

你仍然可以使用map,只需先使用zip:

let list' = zip [1..] list
in map (\(cnt,val) -> if odd cnt then val * 3 else val) list'
Run Code Online (Sandbox Code Playgroud)

在上面您可以看到如何使结果依赖于索引以及该索引处的值。这是一个相当通用的解决方案,通过替换 lambda( 的第一个参数map),您可以做出许多变体。cycle使用and 的更专业的解决方案zipWith要短得多,并且对于那些熟悉 Haskell 的人来说完全可读。

在声明这不是家庭作业之后进行了编辑和充实。