私の経験では、すべての用語を直感的に理解することは魅力的ではないようですが、追求する価値があります。
永続的記憶域への関心は、表現と原子値を混在させるという問題を検討するための迂回経路で私を導いてくれました。これをサポートするために、私は型システムで完全に分離することに決めました。したがって、Int、Charなどは、整数値と文字値の型コンストラクタです。式の型は、多態型のコンストラクタExpで形成されます。例えばExp Intは、あるステップでIntに減少する値を指します。
あなたの質問に対するこれの関連性は、評価を検討する際に発生します。基本的なレベルでは、原子値を必要とするプリミティブがあります:COND、addIntなどです。表現を強制するものとして、これを参照する人もいます。
これは明示的な削減指令を必要とせずにこれを実行できるかどうかを確認することです。 1つの解決策はあなたの提案とまったく同じです。つまり、強制を過負荷の一種として扱うことです。
たちは入力スクリプトを持って言う:foo x
その後、sugaring後、これは次のようになります。
coerce :: a -> b
coerce x = REDUCE (cast x) if a and b are incompatible
x otherwise
したがって強制が身元やアプリケーションのいずれかです:非公式、(coerce foo) (coerce x)
キャストここで、bは、特定のコンテキストの戻り値の型です。
キャストをタイプクラスメソッドとして扱うことができるようになりました。
class Cast a, b where {cast :: a -> b };
-- ¬:: is an operator, literally meaning: don’t cast
--(!) is the reduction operator. Perform one stage of reduction.
-- Reduce on demand
instance Cast Exp c, c where { inline cast = ¬::(!)(\x::(Exp c) -> ¬::(!)x) };
¬::
注釈が強制構文sugaringを抑制するために使用されます。
Cast
の他のインスタンスを導入してコンバージョンの範囲を広げることができますが、私はこれを検討していません。あなたが言うように、インスタンスが重なっている必要があります。
私が意図したことは、コンパイラの型推論部がキャストを暗黙的に* int型からfloat型に変換する場所を検出する方法でした。 –