我有2个列表表达式和绑定(id = Expr),并试图用名为newE的新列表中的绑定列表替换每个表达式与其等价物,其中Expression = id .. 最初,我只有一个表达式:
eq(div(add 2 7)(sub 5 2))3
我想用绑定列表中的等价物替换此表达式中的每个标识符,因此我尝试将此表达式拆分为字符串列表并删除括号,以分隔每个标识符。
这就是我尝试实现它的方式:
newE = [\x -> getExp(b) | x <- eStr, b <- bs, x == getId(b)]
where es = getExpressions (prog)
bs = getBindings (prog)
-- Extracting expression into a list of strings
-- and removing brackets
eStr = map (delete ')')(map (delete ')')
(map (delete '(') (split " " (show es))))
newE' = join " " newE
这是对的吗?
现在我收到newE返回的错误[t0 - &gt; Expr]虽然它应该只返回Expr,为什么会这样?
并且join函数期望[Char] ..而Data.List.Utils文档中的类型是:
加入:: [a] - &gt; [[a]] - &gt; [α]
所以,是不是应该接受任何类型而不仅仅是字符列表?或者是否与另一个图书馆的“加入”混淆了? 我搜索了我导入的库,但他们没有连接。
有任何帮助来解决这些错误并修改代码以执行它应该执行的操作吗?
谢谢
答案 0 :(得分:1)
既然你问过,这里是传统方法的草图:
将字符串表达式转换为Expr
值,例如
添加2 7 - &gt; App(App(Var“add”)(Var“2”))(Var“7”)
编写函数lookupBinding
以查找符号的绑定:
lookupBinding :: [Binding] - &gt;符号 - &gt;也许是Expr
编写替代函数,将绑定定义替换为表达式:
替代:: [绑定] - &gt; Expr - &gt; EXPR
它会是这样的:
substitute bindings (App e1 e2) = App e1' e2'
where e1' = substitute bindings e1
e2' = substitute bindings e2
substitute bindings (Var sym) = ... lookupBinding sym ...
substitute bindings (Lam sym exp) = ... substitute bindings' exp ...
答案 1 :(得分:0)
您的列表理解体返回函数\x -> getExp b
。这就是编译器说它返回一个函数类型的原因。