有没有简单的方法。要获取数字列表,请说123456。然后将奇数位置乘以3,偶数位置乘以1。
即(1 * 3)+(2 * 1)+(3 * 3)+(4 * 1)+(5 * 3)+(6 * 1)
我在想 map 功能沿线。但我不知道如何将* 3映射到仅奇数放置的值。哦,如果您可以给我一个版本,而不是像实际的一个或多个函数那样,那么它就像是从外部haskell文件中导入的
谢谢您的帮助
最佳答案
好的,正如我之前在评论中所写,zipWith (*) (cycle [3,1]) xs
是您所要的。但是首先,一个小的nitpick:列表的头我称第零个元素,这就是为什么我将1和3切换为:-)的原因
让我们来看一个简单的例子。让xs
为[9,8,7,3,2]
。 cycle [3,1]
只是一遍又一遍地重复其参数,因此它将是一个以[3,1,3,1,3,1,..]开头的无限列表。 zipWith f xs ys
的工作是将xs
的head元素和ys
的head元素应用于这些元素,然后将f
(应该是两个参数的函数)应用到这些元素-f
的结果放在zipWith
的结果的最前面。如果xs或ys之一为空,则说明操作已经完成;否则我们就继续前进。
所以结果的第一个元素是(3 * 9)
,然后是(1 * 8)
,(3 * 7)
,(1 * 3)
,(3 * 2)
,我们完成了!
您可以看一下zipWith
here的定义。
如果您真的不想使用预定义的函数,则可以定义一个使用两个函数而不是两个函数的“备用映射”,将其中的第一个应用到参数列表的开头,然后在递归调用中切换这些函数。我会让你弄清楚那里的细节...
关于Haskell-以不同方式映射奇数放置值和偶数放置值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2942101/