我需要定义一个函数'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/