私は最近、基本的なプログラミング言語のインタープリターを書いていますが、すべてうまくいっています。ただし、ダブルスのサポートを追加するための最良のアプローチについて誰かがアドバイスしてくれます。現在、Ints のみがサポートされていますが、Doubles のサポートも追加したいと考えています。
2 に答える
type Env a = [[Var, a]]
これはタイプのファミリーです。Env Int
は int 環境、Env Double
は double 環境などです。これは int と double の両方を保持できる型ではありません。これはおそらく必要なものです。
整数と double の両方を保持できる型は次のようになります。
data Val = IntNum Int | DoubleNum Double
そして、あなたの環境を次のようにすることができます
type Env = [ (Var, Val) ]
(ここでリストのリストを使用している理由がわかりません)。
IntNum
ケースとケースに対して個別に算術演算を定義する必要がありDoubleNum
ます (言語がサポートしている場合は、混合オペランドに対しても定義する必要があります)。
ブール値とリストの追加は簡単です。別の 2 つのケースを に追加するだけVal
です。
言語が複数の型をサポートし始めると、言語で発生する型エラーに対処する必要があります。この単純な設計は、静的にタイプセーフな言語には適していないと思います。それが必要な場合は、デザインを大幅に変更する必要があります。
Int
簡単な答えは、etherまたはDouble
sを保持できるバリアント型を定義することです。
data Value = Int Int
| Double Double
Env
およびその他の型の定義を適宜変更します。
type Env = [[(Var, Value)]]
data ValExpr = IVar Var
| IVal Value
...
ただし、さらに型を追加する予定がある場合は、GADTの使用を検討します。
編集:タイプミス