功能列表中的功能组合!

时间:2010-12-03 02:47:14

标签: haskell recursion functional-programming

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

E.g。

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

给出答案7。

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

如果任何解决方案都可以用伪代码编写,请记住我不能使用非常值得赞赏的循环,变量等。显然,解决方案是一个单行的答案。我想它涉及递归(99%的任务函数都可以!)。

另外,我不了解Haskell(我想我必须学习!)所以psuedo代码甚至简单的英语都会很棒。 -

非常感谢。

5 个答案:

答案 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