【问题标题】:Haskell recursively applying function to every element but first?Haskell递归地将函数应用于每个元素,但首先?
【发布时间】:2019-06-10 23:25:39
【问题描述】:

所以我一直在做这个程序,它接收一个函数f、一个数字a和一个列表b,它应该返回一个列表[a, f(a,b), f(f(a,b),b, ..],遍历列表b并使用递归。你们知道如何优化我的代码吗?

calculate :: (a -> b -> a) -> a -> [b] -> [a]
help :: (a -> b -> a) -> a -> [b] -> [a]

help f a (x:xs) = (f a x) : (calculate f (f a x) xs)
help f a [] = []

calculate f a b = a : (help f a b)

【问题讨论】:

  • scanl f a (repeat b) 呢?
  • 提示:doit f (x:xs) = x : do_the_full_recursive_step f xs
  • “你们知道如何优化我的代码吗?” “优化”是什么意思?你给它的表现计时了吗?你在问什么?
  • 谢谢。 @AJFarmar 不,我的意思是缩短它的方法。
  • 你确定这段代码能达到你想要的效果吗?

标签: list function haskell recursion optimization


【解决方案1】:

calculate f a b = tail . concatMap (replicate 2) . scanl f a $ b

复制位可能有误。如果是这样,那么只需calculate = scanl

这会翻译代码,因为文本中的“[a, f(a,b), f(f(a,b),b, ..]”与它相矛盾(并且它与文本本身相矛盾,即“迭代通过列表b”)。

【讨论】:

  • 如果我将其用作calculate f a b = tail . concatMap (replicate 1) . scanl f a $ b,则效果很好
  • 好的,但concatMap (replicate 1)id 相同,id . ff 本身相同。使用replicate 1,您也不需要tail
猜你喜欢
  • 1970-01-01
  • 2019-02-11
  • 2013-03-21
  • 1970-01-01
  • 1970-01-01
  • 2014-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多