【发布时间】: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