【发布时间】:2022-01-25 06:47:02
【问题描述】:
现在我正在尝试使用 Haskell 编写一个玩具语言前端。
还有两个实体:
- 右值 - 变量和整数文字(例如)
- 左值 - 仅限变量。
我认为用数据结构来描述这一点最自然的方式是:
data LValue = Var String
data RValue = Var String | Lit Int
(我真的认为这是最好的方法 - 不够冗长和严格,感谢详尽的模式匹配) 但是 ghc 显示错误:“Var 的多个声明”。
所以问题是:在 Haskell 中描述我想要什么的最直接的方式是什么?
注意事项: 11年前有一个类似的问题没有好的答案。但是这11年有什么变化吗? One value constructor belonging to two different types
还有一些其他方法可以在数据构造函数中再次“打包”LValue(一次又一次地以较少的玩具语言),如下所示:
data LValue = Var String
data RValue = LValue LValue | Lit Int
但我怀疑这是不是一个好方法:AST 转换代码变得过于冗长。
【问题讨论】:
-
data RValue = LValue | Lit Int怎么样? -
hm.... 虽然它比 i 好(我想念这种方法)但是 LValue 真的是 RValue 的子集吗(在我看来,这个问题太重要了)?
-
我只是按照您在开始时给出的定义进行了理解。右值:变量和文字,左值:仅变量。
-
你想要什么,使用两种类型,你怎么知道
Var "x"是什么类型?一个变量可能能够服务作为左值,但它不是一种左值。您正在将您的语言 的属性与您可以用您的语言 表示的对象混为一谈。 -
这无疑是个好主意(而且比我自己发现的要好)。但我想知道它是“刚刚好”还是“最好的”?如果在“程序语言”中 RValue 真的是“LValue 和其他一些类型的值” - 它是“最好的”,并且问题 cat 被关闭。如果不是 - 我会尝试找到“主题区域对象在数据类型上匹配 1:1”的解决方案