【问题标题】:No instance for (Show ([(String, Int)] -> Int))(Show ([(String, Int)] -> Int)) 没有实例
【发布时间】:2012-10-16 17:24:35
【问题描述】:

如果我使用 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有关。

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

【问题讨论】:

  • it 是一个函数,因此无法打印。你是怎么定义it的?
  • 您尝试运行的 GHCi 命令是什么? (看起来你忘记传递参数了)
  • 我认为您需要为解析后的表达式提供一个环境 - 我想 [] 应该可以解决问题。
  • @KarolisJuodelė:在这种情况下,it 只是 GHCi 内部使用的变量名。这就是您在提示符下输入的任何表达式。
  • 非常感谢你们的帖子。 ;)

标签: parsing haskell lambda happy


【解决方案1】:

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

> eval "1 + 1"

当你应该通过一个空的环境时

> eval "1 + 1" []

或一个带有一些预定义变量的变量

> eval "x + x" [("x", 1)]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-06
    • 1970-01-01
    相关资源
    最近更新 更多