【问题标题】:Apply a function to next two elements in list将函数应用于列表中的下两个元素
【发布时间】:2016-09-07 08:34:02
【问题描述】:

我正在编写一个函数来为列表中的下两个元素应用一个函数。

例如:applyToTwo (+) [1,2,3,4] 返回[3,5,7]

applyToTwo (-) [7,1,1,1,1]返回[6,0,0,0]

我想概括该类型,以便它可以应用于我想要的任何类型。我的尝试是:

applyToTwo :: (a -> a -> b) -> [a] -> [a]
applyToTwo f [] = []
applyToTwo f [x] = []
applyToTwo f (x:x1:rest) = f x x1 ++ applyToTwo f (x1:rest)

顺便问一下,有没有办法概括要应用的元素的数量,以便它可以应用于 3、4、5?

【问题讨论】:

    标签: list function haskell


    【解决方案1】:

    看起来你只是在压缩一个带有尾部的列表,所以你可以使用zipWith

    applyToTwo f xs = zipWith f xs (tail xs)
    

    【讨论】:

      【解决方案2】:

      应该这样做:

      applyToTwo :: (a -> a -> b) -> [a] -> [b]
      applyToTwo f [] = []
      applyToTwo f [x] = []
      applyToTwo f (x:x1:rest) = f x x1 : applyToTwo f (x1:rest)
      

      推广到任意数量应该是可能的,但它需要一些高级类型级别的黑客。

      【讨论】:

      • 正如我在对类似问题的回答中指出的,如果前两个案例列在 applyToTwo f (x:x1:rest) 案例之后,您可以将前两个案例替换为 applyToTwo f _ = []
      猜你喜欢
      • 1970-01-01
      • 2021-12-27
      • 2013-03-21
      • 2014-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-21
      相关资源
      最近更新 更多