【问题标题】:Haskell - Calculate sum of functions by creating a higher class functionHaskell - 通过创建更高级别的函数来计算函数的总和
【发布时间】:2019-04-02 20:13:37
【问题描述】:

不使用导入代码(我可以使用head,tail,init,last,filter,map,fold,.,一般是基本的haskell函数) 我想创建一个高阶函数 int ,输入 hof :: [Integer->Integer]->(Integer->Integer) ,使用 hof s = \n ->.... (使用 lambda) 实现以下数学公式

(对不起,是手写的)

需要一些基本的启动指南,我考虑过每次 hof 函数都实现一个递归调用,该 hof 本身应该实现一个适用于递归尾调用的更改后的数学公式(我给出的)。

应该产生的一些结果:

Main> map (hof [(+1)]) [1..10]
[2,3,4,5,6,7,8,9,10,11]

Main> map (hof [(+1),(+2)]) [1..10]
[3,4,6,7,9,10,12,13,15,16]

Main> map (hof [(2^),(2^),(2^),(2^),(2^)]) [5..12]
[42,85,170,341,682,1364,2728,5456]

Main> map (hof [(*2),(+100),(^3),negate,(mod 100)]) [24..40]
[2768,3151,3567,4020,4509,5038,5609,6221,6876,7575,8322,9117,9960,10855,11805,
12806,13863]

Main> map (hof [(mod 100),negate,(+100),(^3),(*2)]) [24..40]
[1181,1351,1562,1767,1989,2230,2490,2771,3071,3395,3774,4145,4539,4958,5402,5873,6369]

Main> map (hof [(‘mod‘ i) | i<-[50..100] ]) [1000..1030]
[23,24,27,28,30,32,35,36,39,40,37,38,40,41,44,45,47,48,52,53,55,31,33,35,37,39,42,
45,46,48,47]

感谢阅读!

【问题讨论】:

  • 你在实现这个时遇到了什么问题?
  • 我还没有找到开始实现这个的方法,如果它是一个多项式而不是包含 f(n) 函数的数学公式,我可以做到
  • 如何编写一个计算多项式的函数?
  • 那么,你做了什么尝试?
  • 多项式 (h:t) = \x -> h + x * ((poly t) x)

标签: function haskell lambda


【解决方案1】:

假设你有一个函数列表:

fs = [f1, f2, f3, f4, f5] -- or more

现在,对于从 0 到无穷大的每个值 i,我们希望将一个从 fs 的函数应用到对应的 n - i,然后将该值除以 2i,然后我们想要对结果楼层求和。

hof fs = \n -> sum [ fi (n-i) `div` (2^i) | (fi, i) <- zip fs [0..]]

尽管[0..] 是一个无限列表,但zip fs [0..] 的结果是有限的,受fs 长度的限制。

为避免对每个连续的 2 幂进行重复乘法,请使用 iterate 函数计算它们的序列以与 fs[0..] 一起压缩

hof fs = \n -> sum [fi (n-i) `div` k | (fi, i, k) <- zip3 fs [0..] (iterate (*2) 1)]

【讨论】:

  • 你也可以zip3 (iterate (2*) 1) ...,我相信这样可以省去每次都从头开始2^i
  • 效果很好!对我来说似乎很神奇。是的,我理解无限列表实现部分,只是这段代码 (fi, i)
  • 不知道为什么你可以使用fold而不是zip
  • 我相信某处有一个语言扩展,可以让您将zip 替换为[ ... | fi &lt;- fs | i &lt;- [0 ..] ] 之类的东西。
  • ParallelListComprehensions 是扩展
猜你喜欢
  • 2013-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-04
  • 2019-09-18
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多