我正在写一个SQL解释器.我需要在编译时区分不正确的表达式和运行时错误.
我会给你一个应该是格式良好的例子,但可能在运行时失败.
SELECT $ [ColumnName "first_name" `AS` "name"] `FROM` TABLE "people.csv" `WHERE` (ColumnName "age" `Gte` LiteralInt 40)
Run Code Online (Sandbox Code Playgroud)
我想专注于表达:
(ColumnName "age" `Gte` LiteralInt 40)
Run Code Online (Sandbox Code Playgroud)
这应该通过类型检查器.但是,说"年龄"并不包含可以表达为a的东西LiteralInt.
所以我想要Gte产生类似的东西IO Bool(暂不考虑异常处理).
但我并不总是需要Gte制作一个IO Bool.如果我有这样的事情:
(LiteralInt 40 `Gte` LiteralInt 10)我只需要一个Bool.或类似的东西:
(LiteralInt 40 `Gte` LiteralBool True)需要在编译时失败.
所以,我一直在玩弄数据系列和GADT,并且已经落下了许多死胡同,如果我解释它们就会混淆这种情况.
我的问题是否有意义,如果是这样,我可以通过一个探索的途径来解决问题?