我在写一个SQL解释器。我需要在编译时区分格式不正确的表达式和运行时错误。是否有可能对同一构造函数有不同的行为?
我给你一个应该是良构的东西的例子,但可能在运行时失败。
SELECT $ [ColumnName "first_name" `AS` "name"] `FROM` TABLE "people.csv" `WHERE` (ColumnName "age" `Gte` LiteralInt 40)
我想聚焦于表达:
(ColumnName "age" `Gte` LiteralInt 40)
这应该通过类型检查。但是,说“年龄”并不包含可以表示为LiteralInt
的内容。
所以我想Gte
产生像IO Bool
(目前不在意异常处理)。
但我并不总是需要Gte
才能生成IO Bool
。如果我有这样的事情:
(LiteralInt 40 `Gte` LiteralInt 10)
我只需要一个布尔。 或类似的东西: (LiteralInt 40 `Gte` LiteralBool True)
需要在编译时失败。因此,我一直在与数据家族和GADT一起玩耍,并且走了很多死路,如果我解释它们,这些死路都会混淆局面。
我的问题是否有意义,如果有的话,是否有我可以遍历的探索路径,这将导致解决方案?
通过让一些表达式返回'Bool'而不是'IO Bool',你会获得什么? – chepner
类型安全的SQL接口?在[_The Power of Pi_]中有一个例子(https://cs.ru.nl/~wouters/Publications/ThePowerOfPi.pdf),以及[singletons'文件]中的Haskell翻译(http://cs.brynmawr埃杜/〜RAE /纸/ 2012 /单身/ paper.pdf)。最大的想法是预先声明模式,并在打开数据库连接时检查它是否与实际模式匹配。 –
谢谢本杰明,我要去兔子洞。 :) –