0

如果我使用 lambda 表达式,那么在快乐的生产规则中动态计算表达式的值是行不通的。

例如这段代码

Exp   : let var '=' Exp in Exp  { \p -> $6 (($2,$4 p):p) }
      | Exp1                    { $1 }

Exp1  : Exp1 '+' Term           { \p -> $1 p + $3 p }
      | Exp1 '-' Term           { \p -> $1 p - $3 p }
      | Term                    { $1 }

Term  : Term '*' Factor         { \p -> $1 p * $3 p }
      | Term '/' Factor         { \p -> $1 p `div` $3 p }
      | Factor                  { $1 }

Factor            
      : int                     { \p -> $1 }
      | var                     { \p -> case lookup $1 p of
                                    Nothing -> error "no var"
                                     Just i  -> i }
      | '(' Exp ')'             { $2 }

来自http://www.haskell.org/happy/doc/html/sec-using.html不起作用。

或者更准确地说,我收到了一条错误消息

No instance for (Show ([(String, Int)] -> Int))
      arising from a use of `print'
    Possible fix:
      add an instance declaration for (Show ([(String, Int)] -> Int))
    In a stmt of an interactive GHCi command: print it

如果你能解释一下我必须改变什么,那就太好了。

它必须与 lambda 表达式和环境变量 p 有关。

当我使用数据类型时,一切都很好。

4

1 回答 1

8

这里要注意的是,这个解析器的结果是一个函数,它采用变量绑定的环境。报错信息基本上是GHCi告诉你不能打印函数,大概是因为你忘了传环境

> eval "1 + 1"

当您应该通过一个空环境时

> eval "1 + 1" []

或带有一些预定义变量的

> eval "x + x" [("x", 1)]
于 2012-10-16T17:55:02.603 回答