いくつかの互換性のないデータ・タイプを作成したいとします。つまり、私は実際にa
が何であるかについてを気にすることなくパラメータ化された型Foo a
、および、そのような私は、Haskellでシングルトンタイプを正しく考えて使用していますか?
bar :: (Foo a) -> (Foo a) -> (Foo a)
としての機能を持っているしたいと思います。およそInt
とChar
(私は、彼らが同じじゃないことを気にし)同時に、私は本当に気にしませんが、さらに明確にするために、私は
x :: Foo Int
y :: Foo Char
bar x y
をやってから私を停止するように型システムが欲しいです。
私の実際のコードでは、与えられた環の多項式の型があります。私は実際には、型システムが多項式をsの多項式でtに加えるのを止めている限り、不定数が何であるかは気にしません。これまでのところ、私は与えられた多項式が終わったどの特定のリングについてケアを行うので、このアプローチはRing
部分は完全に自然な感じ型クラスIndeterminate
を作成することでこれを解決し、そして
data (Ring a, Indeterminate b) => Polynomial a b
としての私の多項式タイプをパラメータ化しました。以下に説明するように、Indeterminate
の部分については非常に工夫されています。
上記の方法は問題なく機能しますが、問題はありません。特にこの部分:
class Indeterminate a where
indeterminate :: a
data T = T
instance Indeterminate T where
indeterminate = T
data S = S
instance Indeterminate S where
indeterminate = S
(など、多分もっと不確定なもの)。それは不思議で間違っているように感じます。基本的に私はIndeterminate
のインスタンスにシングルトン(this sense)を要求しようとしています。奇妙な気持ちは、私がこれを間違って攻撃している可能性のある指標です。もう一つは実際のタイプb
がしばしば推測できないので(私はPolynomial a b
の多くの注釈をつける必要があるという事実ですが、これは奇妙ではありませんが厄介です)。
提案がありますか?私はちょうどこれのようにそれを続けなければならない、または私は何かを逃している?
PS:すぐにアップヴォートしたり受け入れたりしないと怒らないでください。私は数日間チェックインできません。
多項式をリングの要素のシーケンスまたは同様のもの(例えば、部分和のシーケンス)としてモデル化しないのに十分な理由はありますか? –
私はここで少し失われています。私はあなたがなぜ「不確定」を必要としているのか分かりません。 2つのBSが同じであることを強制したい場合は、タイプシグネチャのままにしてください。 – sclv
@Alexandre C .:私はそれをやっています。しかし、タイプシグネチャは、 "2 + 5t"を "6s"に追加する意味がないようにしたいと思います。環要素のシーケンスとしての多項式では、型システム(正当なもの)は、ある環に係数を持つ多項式を他の環に係数を加えて追加するのを止めますが、不確定性を区別しません。今、私が実際に不確定要素を必要としているかどうかは、非常に有効な質問です:-) – gspr