有没有简单的方法。要获取数字列表,请说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/

10-13 01:55