我在Haskell中实现FP(Backus)解释器时遇到问题.
FP函数看起来像这样:
[+,*]:<2,3>
Run Code Online (Sandbox Code Playgroud)
应该结果
<+:<2,3>, *:<2,3>> ->
<5,6>
Run Code Online (Sandbox Code Playgroud)
这意味着左侧列表中的每个函数都应该在右侧列表的每个元素上执行.
我的理解是我需要类似于"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)]
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚为什么...... :-(
编辑2:
对不起,我太累了,不能整天工作.问题是我不需要第二个管道,只需要第一个:
apply fs v = [ apply_f f v | f <- fs ]
Run Code Online (Sandbox Code Playgroud)
现在,一切正常,非常感谢!:-)
Lee*_*Lee 16
这听起来像你想要的:
import Control.Applicative
apply :: [a -> b] -> [a] -> [b]
apply fs vals = fs <*> vals
Run Code Online (Sandbox Code Playgroud)
当然,这与<*>列表定义的实例相同.
Der*_*all 13
我相信您正在寻找该zipWith功能并将其应用于功能应用程序操作员$.
因此,如果您有一个函数列表funcList和一个值列表,valueList您可以使用以下命令:
zipWith ($) funcList valueList
Run Code Online (Sandbox Code Playgroud)
所以,使用它会是这样的
zipWith ($) [(+ 5),(* 3)] [1,5]
Run Code Online (Sandbox Code Playgroud)
给你结果 [6,15]
要获得一种可以使用的交叉应用程序
[f a | f <- [(+5), (*3)], a <- [1,5]]
Run Code Online (Sandbox Code Playgroud)
这给了你[6,10,3,15].不确定你的意思是什么?<,你想要对,嵌套列表或你究竟需要什么?
你想要这样的东西吗?
[f x | f <- [(+3),(*2)], x <- [1..2]]
Run Code Online (Sandbox Code Playgroud)
输出:
[4,5,2,4]
Run Code Online (Sandbox Code Playgroud)
编辑:
这样的事情呢?
[[f x | f <- [(+3),(*2)]] | x <- [1..2]]
[[4,2],[5,4]]
Run Code Online (Sandbox Code Playgroud)