如何将逻辑表示法转换为Haskell语法

Sif*_*ifu 1 haskell functional-programming

我最近在大学学习了Haskell,我正在通过一系列的练习,这里有一段我​​无法理解的片段:

"考虑一下简单的前缀计算器语言的以下语法:"

num ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
int ::= num | num int
expr ::= int | - expr | + expr expr | * expr expr
Run Code Online (Sandbox Code Playgroud)

我很困惑如何将其转换为Haskell语法(我是Haskell和函数式编程的完全初学者,请温柔)

我怀疑num,int并且可能expr是所有可以声明的类型/值,data或者type它们对计算器施加约束.但是我无法理解:我如何声明typedata(不是变量)固定值,即0-9?另外,我如何在声明中添加符号-或符号+

Dan*_*ner 7

不要在表示它的AST的语法中混淆字符串.比较字符串

"+ + 3 4 5"
Run Code Online (Sandbox Code Playgroud)

这是你给出的语法中的一个字符串

Plus (Plus (Literal 3) (Literal 4)) (Literal 5)
Run Code Online (Sandbox Code Playgroud)

这将是一个合理的Haskell值,String可以解析为AST .

  • 确实.请注意,如果AST紧跟OP语法,则文字基本上是非空的数字列表,这可能会增加AST中使用的构造函数的数量.当然,最好将文字解析为"Int"并避免问题,但由于这是一个练习,我不确定"预期"的解决方案. (2认同)