我需要定义一个函数'Compose',它取一个列表'L',它是一个函数列表。当我指定一个适合列表中所有函数的参数时,最后一个函数使用此参数计算自身。结果然后传递给倒数第二个函数,依此类推,直到我们到达列表中的第一个项目(函数),我们得到最终结果。
E.g。
撰写((fn N - > N + 1)^(fn N - > 2 * N)^#)3。
给出答案7。
我必须用一种名为SAL(简单的应用语言)的函数式编程语言来编写这个语言,这个语言由我大学的一位讲师设计(因此上面有趣的语法(^分隔列表项和#marks end of list)。)
如果任何解决方案都可以用伪代码编写,请记住我不能使用非常值得赞赏的循环,变量等。显然,解决方案是一个单行的答案。我想它涉及递归(99%的任务函数都可以!)。
另外,我不了解Haskell(我想我必须学习!)所以psuedo代码甚至简单的英语都会很棒。 -
非常感谢。
答案 0 :(得分:14)
如果解决方案是单行答案,则可能涉及折叠:
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
答案 1 :(得分:4)
在haskell中:
compose :: a -> [a -> a] -> a
compose a (x:xs) = x (compose a xs)
compose a [] = a
答案 2 :(得分:1)
Dan有点放弃它,但这里有一个关于如何自己做的暗示。您可以递归数字:
0! = 1
n! = (n-1)! * n
你也可以在结构上进行递归。例如,列表具有递归结构,分为两种情况:空列表和后跟列表其余部分的项。没有特别的语言:
List := Item x List
| Nil
Item
标记列表的头部,x
是存储在头部的值,List
是尾部。在这个语法中,你的列表将写成:
Item ( fn N -> N + 1 ) Item ( fn N -> 2 * N ) Nil
您的教授发明的语法中的列表规则可以递归写为:
List := x ^ List
| #
列表上的函数必须在此结构上进行递归,这意味着它会处理以下两种情况:
sum l:List = Nil -> 0
| Item x xs:List = x + sum xs
递归,特别是术语sum l:List = x + sum xs
。使用教授的语法编写此函数作为练习。
在你的问题中,你的元函数需要一个函数列表,并且必须返回一个函数。考虑每个案例,空列表和一个项目(头部)后跟一个列表(尾部)。在后一种情况下,您可以递归地使用函数从尾部获取函数,然后以某种方式将其与头部组合以返回函数。无论如何,这都是要点。
答案 3 :(得分:1)
同样使用幺半群,无点
var target = e.target;
var wrapper = document.querySelector(".drop_down_wrapper");
while (target != wrapper && target !== document) {
target = target.parentNode;
}
或更普遍:
import Data.Monoid
compose :: [a -> a] -> a -> a
compose = appEndo . mconcat . map Endo
答案 4 :(得分:0)
以下是我使用的内容:
compose :: [a -> a] -> a -> a
compose list startingvalue = foldl (\x f -> f x) startingvalue list