映射Haskell中列表中的函数列表

时间:2012-08-25 17:08:36

标签: haskell map

我在Haskell中实现FP(Backus)解释器时遇到了问题。

FP函数如下所示:

[+,*]:<2,3>

应该以

结果
<+:<2,3>, *:<2,3>> ->
<5,6>

意味着左侧列表中的每个函数都应该在右侧列表的每个元素上执行。

我的理解是我需要类似于“map”功能的东西,但是map在列表中应用了一个函数,我需要在值列表上列出函数。

提前谢谢! : - )

编辑:

由于我不准确,这是我的代码不起作用:

apply :: [String] -> [Integer] -> [Integer]
apply fs v = [((apply_f f x) | f <- fs | x <- v)]

apply_f :: String -> [Integer] -> [Integer]
apply_f "+" v = [(sum v)]
apply_f "*" v = [(product v)]

我无法弄清楚为什么......: - (

编辑2:

抱歉,我太累了,不能整天工作。 问题是我不需要第二个管道,只需要第一个管道:

apply fs v = [ apply_f f v | f <- fs ]

现在,一切正常,非常感谢! : - )

5 个答案:

答案 0 :(得分:16)

这听起来像你想要的:

import Control.Applicative
apply :: [a -> b] -> [a] -> [b]
apply fs vals = fs <*> vals

当然,这与为列表定义的<*>实例相同。

答案 1 :(得分:13)

我相信您正在寻找zipWith函数并将其应用于函数应用程序运算符$

因此,如果您有一个函数列表funcList和一个值列表valueList,您可以使用以下代码调用它:

zipWith ($) funcList valueList

所以,使用它就像是

zipWith ($) [(+ 5),(* 3)] [1,5]

为您提供结果[6,15]

要获得某种交叉应用程序,您可以使用

[f a | f <- [(+5), (*3)], a <- [1,5]]

这会给你[6,10,3,15]。不确定`&lt;是什么意思,你想要对,嵌套列表或你究竟需要什么?

答案 2 :(得分:7)

你想要这样的东西吗?

[f x | f <- [(+3),(*2)], x <- [1..2]]

输出:

[4,5,2,4]

编辑:

这样的事情?

[[f x | f <- [(+3),(*2)]] | x <- [1..2]]
[[4,2],[5,4]]

答案 3 :(得分:0)

我无法从你的解释中找到任何内容,但这里有一个可能的代码,它为你的例子提供了正确的答案:

> map (uncurry foldr1) [((+), [2,3]), ((*), [2,3])]
[5,6]

答案 4 :(得分:-1)

我不知道你是否真的需要,但是

Prelude> [f 2 3 | f <- [(+), (*)]]
[5,6]

如果您需要&lt; 2,3&gt;的列表对,你可以使用像

这样的东西
Prelude> [zipWith f [2, 20] [3, 30] | f <- [(+), (*)]]
[[5,50],[6,600]]