Haskellで動的型付け言語のインタプリタを書いています。
ほとんどの動的型付け言語インタープリターと同様に、私のプログラムも実行時に型をチェックする必要があります。私のプログラムで最もよく使われるコードの1つはこれです:
interpreterFunction :: Value -> SomeMonadicContext ReturnType
interpreterFunction p = do
VStr s <- ensureType p TString
..
some code that uses s
ここでは、それp
がタイプTString
であることを確認し、その後、でそれを破棄していVStr s <- ...
ます。VStr
タイプがの唯一の値であるため、これが失敗することはありませんTString
。
私のデータ構造は基本的にこれです:
data Value = VStr String | VInt Int | VBool Bool
data Type = TStr | TInt | TBool
そのため、タイプに応じて値を分離しています。すなわち。型として持つ値コンストラクターは1つだけTStr
です。
今、私は自分のensureType
関数と破壊コードを単純化する方法があるかどうか疑問に思っています。たとえば、そのようなことは可能ですか?
interpreterFunction p = do
s <- ensureType p
..
same code that uses s
ここで、タイプs <-
がであると推定できる後のコードから、部分を持つコンストラクターのみがであることが静的にわかっているため、がであるかどうかを動的にチェックした後に戻ります。s
String
Value
String
VStr
ensureType
String
p
VStr
これが理にかなっているのか、それとも可能なのか、私には実際にはわかりません。Haskellの高度な型システム機能を利用して設計を改善する方法を探しています。
どんな助けでもありがたいです。