【问题标题】:How to apply a function to two elements of a list - Haskell如何将函数应用于列表的两个元素 - Haskell
【发布时间】:2021-03-31 02:52:22
【问题描述】:

如何将函数应用于列表的两个元素。例如:

给定列表[red,star,blue,oval,orange,hexagon]我想将函数应用于每一对functionName(red,star)functionName(blue,oval)functionName(orange,hexagon)

我猜我必须使用递归。

【问题讨论】:

    标签: list function haskell


    【解决方案1】:

    是的,方法是定义一个递归函数 - 如果输入列表的项目数不均匀,您需要考虑(以及我们不知道的)应该发生什么? 当然,您希望如何收集该函数的结果?

    假设您只是忽略不均匀列表中的最后一个元素,并且您希望将结果收集到另一个列表中:

    applyPairwise :: (a -> a -> b) -> [a] -> [b]
    applyPairwise f (a1 : a2 : rest) = f a1 a2 : applyPairwise f rest
    applyPairwise _ _ = []
    

    例子:

    > applyPairwise (+) [1..5]
    [3,7]
    

    【讨论】:

      【解决方案2】:

      补充 Carsten 的回答,有时在函数式编程(或一般编程)中,您可能希望将要执行的任务分成几个子任务。所以这里有两个任务:

      1. 将元素与其邻居配对。
      2. 将函数应用于对列表。

      对于第一个任务,我们可以简单地定义一个函数pairing,它执行以下操作(并且还假设您要忽略空列表或单例列表):

      pairing :: [a] -> [(a,a)]
      pairing []       = []
      pairing [x]      = []
      pairing (x:y:xs) = (x,y) : pairing xs
      

      例如:

      pairing [] == []
      pairing [1] == []
      pairing [1,2,3,4] == [(1,2),(3,4)]
      pairing [1,2,3,4,5] == [(1,2),(3,4)]
      

      那么对于任务 2,Haskell 中有一个操作将函数应用于称为 map 的元素列表(这些将函数作为参数的函数称为高阶函数):

      例如:

      f x = x^2
      
      map f [0,1,2] == [0,1,4]
      

      所以我们现在可以像这样实现函数applyPairwise

      applyPairwise :: ((a,a) -> b) -> [a] -> [b]
      applyPairwise f xs = map f (pairing xs)
      

      甚至更好地使用组合:

      applyPairwise f = map f . pairing
      

      【讨论】:

        猜你喜欢
        • 2013-03-21
        • 1970-01-01
        • 2013-01-21
        • 1970-01-01
        • 2021-12-27
        • 2012-05-20
        • 2014-09-24
        • 1970-01-01
        相关资源
        最近更新 更多