私は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
のようなものにしたいと思うでしょう。
IO Bool
を作成するのに、必ずしもGte
が必要なわけではありません。イベントで私はこのようなものを持っていた:
(LiteralInt 40 `Gte` LiteralInt 10)
私はちょうどブールが必要です。 など: (LiteralInt 40 `Gte` LiteralBool True)
はコンパイル時に失敗する必要があります。
私はデータファミリやGADTを使いこなしてきましたが、私がそれらを解明すれば、状況を混乱させるだけの多くのデッドエンドが崩壊しました。
私の問題は理にかなっていますか?そうであれば私は解決策につながる探査の道を探っていますか?
'IO Bool'の代わりに' Bool'を返す式をいくつか持つことで、実際に何を得ることができますか? – chepner
型安全なSQLインターフェイス? [_The Power of Pi_](https://cs.ru.nl/~wouters/Publications/ThePowerOfPi.pdf)と[singletons'論文のハスケル翻訳(http://cs.brynmawr .edu /〜rae/papers/2012/singletons/paper.pdf)。大きなアイデアは、スキーマを先に宣言し、DB接続を開く際にスキーマと一致するかどうかをチェックすることです。 –
ベンジャミンに感謝、私はウサギの穴を下って行く。 :) –