2015-04-03 98 views
1

我有一个函数列表和一个带有“参数”的其他列表来创建一个新列表,其中一个列表中的每个元素都映射到另一个列表的另一个元素。 (申请::奥德U => [V->ü] - > [V] - > [U]) 例如,haskell中的高阶函数

apply [(^2),(^3),(^4),(2^)] [10] = [100,1000,1024,10000]. or 
apply [reverse,(++"ing"),reverse.(++"ing"),(++"ing").reverse] ["play","do"] = ["doing","gniod","gniyalp","od","oding","playing","yalp","yalping"].. 

我能做些什么,因为我在做我的哈斯克尔的第一个步骤。 。

回答

4

让我们把你的第一个列表:

[(^2),(^3),(^4),(2^)] 

它的类型是xs :: Integral a => [a -> a]

现在,你想将它应用到一个列表[10]。你想要的是正是应用型功能<*>,其类型为Applicative f => f (a -> b) -> f a -> f b

λ> import Control.Applicative 
λ> let xs = [(^2),(^3),(^4),(2^)] 
λ> xs <*> [10] 
[100,1000,10000,1024] 

您可以制定出类型,看看他们是如何结合在一起的。你的第二个例子似乎并不正确,因为你没有向你的apply函数传递任何第二个参数。我建议你开始阅读LYAH以进一步巩固这些概念。

+0

这将适用于每个函数的每个参数,对吗? OP想要“一个列表中的每个元素,与另一个列表中的另一个元素映射”,我认为这可以理解为仅应用具有第一个参数的第一个函数,等等。 – user2079303 2015-04-03 12:15:25

+1

@ user2079303我很难解析这个问题。如果这就是OP,那么他可以将这两个列表拉链,然后应用它们。但是,他当前问题的预期结果是错误的呢? – Sibi 2015-04-03 12:21:10

+0

我刚纠正了我的问题(第二个参数适用于我的)..现在更清楚了吗? @sibi我想对每个函数应用每一个参数。正确 – 2015-04-03 12:28:32