haskell - 函数列表中的函数组成!

标签 haskell recursion functional-programming

我需要定义一个函数'Compose',它需要一个列表'L',它是一个函数列表。当我指定一个适合列表中所有函数的参数时,最后一个函数使用此参数评估自身。然后将结果传递给倒数第二个函数,依此类推,直到我们到达列表中的第一项(函数)并获得最终结果。

例如。

撰写((fn N -> N + 1)^(fn N -> 2 * N)^#)​​3。

给出答案 7。

我必须用我大学的一位讲师设计的一种名为 SAL(简单应用语言)的函数式编程语言来写这个(因此上面的语法很有趣(^ 分隔列表项和 # 标记列表的结尾))。

如果任何解决方案都可以用伪代码编写,请记住我不能使用循环、变量等,这将不胜感激。显然,解决方案是一个单行的答案。我想它涉及递归(我们 99% 的任务函数都这样做!)。

我也不懂 Haskell(我想我必须学习!)所以伪代码甚至是简单的英语都会很棒。 –

谢谢一堆。

最佳答案

如果解决方案是单行答案,则可能涉及折叠:

compose :: [a -> a] -> a -> a
compose fs v = foldl (flip (.)) id fs $ v

http://haskell.org/haskellwiki/Compose

您还可以将其实现为正确的折叠,它可以按照您想要的方式工作:
compose = foldr (.) id

*Main> let compose = foldr (.) id
*Main> compose [\x -> x+1, \x -> 2 * x, id] 3
7

关于haskell - 函数列表中的函数组成!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4342013/

相关文章:

haskell - GHC 在解构和重建对象时是否会创建对象的新副本?

haskell - 我如何证明 traverse 与 fmap 进行了明智的交互?

javascript - 如何在 Node 中 promise 和等待 setImmediate?

java - 旅行推销员 - 如何找到不等价的排列

haskell - 在 Haskell 中开发时查看未公开的库函数

error-handling - EitherT 是如何工作的?

haskell - 单态约束对类型类约束的影响

javascript - 使用键 x 和 y 从 2 个数组创建一个数组

javascript - Immutable.js 比较是如何工作的?

ruby - Ruby 中数组到对象的复杂映射