如何在列表的每个元素上应用更复杂的操作?

时间:2017-03-15 18:59:01

标签: haskell

我需要对列表的每个元素应用一个操作。操作是" y =(3 * x)rem 16"。在这种情况下,我(我想)不能使用地图功能。

例如:

x = [0 1 2 3 4 5 6]

y = [0 3 6 9 12 15 2]

我是功能性编程的新手,尤其是haskell,所以我遇到了一些麻烦。

由于

2 个答案:

答案 0 :(得分:4)

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

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

ghci> map fancypants [0,1,2,3,4,5,6]

答案 1 :(得分:0)

使用列表推导:

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

你也可以试试这个,虽然它看起来不太可读,但它涉及map

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

以下是它的工作原理:

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

现在,您可以使用rem 16代替那个flip ping商家,但在这种情况下,该函数会返回rem 16 x,而不是{39}你想要什么。

你也可以使用它,它看起来比第二个版本更清晰:

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

.中的点(function1 . function2)创建了一个复合函数,其作用如下:function1 $ function2 x