加入函数和类型问题haskell

时间:2014-02-16 23:15:42

标签: haskell join types

我有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; [α]

所以,是不是应该接受任何类型而不仅仅是字符列表?或者是否与另一个图书馆的“加入”混淆了? 我搜索了我导入的库,但他们没有连接。

有任何帮助来解决这些错误并修改代码以执行它应该执行的操作吗?

谢谢

2 个答案:

答案 0 :(得分:1)

既然你问过,这里是传统方法的草图:

  1. 将字符串表达式转换为Expr值,例如

    添加2 7 - &gt; App(App(Var“add”)(Var“2”))(Var“7”)

  2. 编写函数lookupBinding以查找符号的绑定:

    lookupBinding :: [Binding] - &gt;符号 - &gt;也许是Expr

  3. 编写替代函数,将绑定定义替换为表达式:

    替代:: [绑定] - &gt; Expr - &gt; EXPR

  4. 它会是这样的:

    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。这就是编译器说它返回一个函数类型的原因。