我在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 ]
现在,一切正常,非常感谢! : - )
答案 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]]