0

私は最近、基本的なプログラミング言語のインタープリターを書いていますが、すべてうまくいっています。ただし、ダブルスのサポートを追加するための最良のアプローチについて誰かがアドバイスしてくれます。現在、Ints のみがサポートされていますが、Doubles のサポートも追加したいと考えています。

4

2 に答える 2

4

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です。

言語が複数の型をサポートし始めると、言語で発生する型エラーに対処する必要があります。この単純な設計は、静的にタイプセーフな言語には適していないと思います。それが必要な場合は、デザインを大幅に変更する必要があります。

于 2012-06-15T18:51:25.017 に答える
2

Int簡単な答えは、etherまたはDoublesを保持できるバリアント型を定義することです。

data Value = Int Int
           | Double Double

Envおよびその他の型の定義を適宜変更します。

type Env = [[(Var, Value)]]

data ValExpr = IVar Var
             | IVal Value
             ...

ただし、さらに型を追加する予定がある場合は、GADTの使用を検討します。

編集:タイプミス

于 2012-06-15T18:38:43.023 に答える