2017-03-15 47 views
0

我需要对列表的每个元素应用一个操作。操作是“y =(3 * x)rem 16”。在这种情况下,我(想我)不能使用地图功能。如何将更复杂的操作应用于列表的每个元素?

例:

x = [0 1 2 3 4 5 6] 

y = [0 3 6 9 12 15 2] 

我funcional编程很新,特别是Haskell的,所以我遇到一些麻烦一点。

感谢

+5

*为什么*你认为你不能使用'map'? – crockeea

回答

0

使用列表理解:

[(3 * x) `rem` 16 | x <- data_source] 

你也可以试试这个,虽然它可能看起来不是那么可读的,但它涉及map

map ((flip rem) 16) $ map (3*) data_source 

这里的它是如何工作的:

  • map (3*) data_source乘以3的data_source每个元素,非常简单
  • map ((flip rem) 16) $ stuff功能((flip rem) 16)适用于stuff
    • (flip rem) 16每个元素是一个参数x的一个函数,计算的rem x 16

现在,您可以使用rem 16而不是flip ping业务,但在这种情况下,函数将返回rem 16 x,而不是您想要的。


你也可以利用这一点,它看起来比第二版更清洁了一下:

map (((flip rem) 16) . (3*)) data_source 

的点(.),如function1 . function2创建其工作方式如下的复合函数:function1 $ function2 x

+1

考虑你正在接听的学生的水平。看来这个学生从来没有见过拉姆达;这是一个相当先进的答案考虑。 (构图,HOFs,章节......) – luqui

+0

@luqui,我试着从最简单的例子开始,然后转移到一些更复杂的东西,同时解释代码如何工作。顺便说一句,感谢您在一个月前刚刚开始学习Haskell时称我的答案'非常先进':D看起来我并没有太糟糕。 – ForceBru

+0

列表理解解决方案是完全可读和可爱的。免费的东西是“先进的”,因为它表明你掌握了一些有用的技术,但最好不要在这里应用。 – amalloy

4

你绝对可以使用map,你只需要定义你想要在列表上映射的函数。

fancypants x = (3*x) `rem` 16 

ghci> map fancypants [0,1,2,3,4,5,6] 
相关问题