これは、2 つの異なる種類のポリモーフィズムを混同しています。必要なのは、型クラスを介して行われるアドホック ポリモーフィズムです。型の関数のポリモーフィズムの種類a -> Int
は、パラメトリック ポリモーフィズムです。パラメトリック ポリモーフィズムでは、 の 1 つの関数定義が可能なすべてのtypeに対して機能するchoice
必要があります。この場合、これは type の値について何も知らないため、実際には type の値を使用できないことを意味するため、 のような定数関数でなければなりません。これにより、関数の型を調べるだけで、実際に関数ができることについて非常に強力な保証が得られます (このプロパティはparametricityと呼ばれます)。a
a
choice
choice _ = 3
型クラスを使用すると、例を次のように実装できます。
class ChoiceClass a where
choice :: a -> Int
instance ChoiceClass Int where
choice _ = 0
instance ChoiceClass String where
choice _ = 1
instance ChoiceClass a where
choice _ = 2
ここで、この型クラスのアプローチは、特に使い始めたばかりの人が使用したい場合は特に、間違っていることが多いことを指摘しておく必要があります。質問のタイプのような単純なタイプを避けるために、絶対にやりたくありませんChoice
。多くの複雑さが追加される可能性があり、最初はインスタンスの解決が混乱する可能性があります。型クラス ソリューションを機能させるには、2 つの拡張機能をオンにする必要があることに注意しFlexibleInstances
てください。型クラスは「オープンワールド」の前提で機能するため、これも必要です (つまり、後で誰でも新しい型のインスタンスを追加することができ、これを考慮する必要があります)。これは必ずしもそうではありませんTypeSynonymInstances
String
[Char]
OverlappingInstances
悪いことですが、ここでは、はるかに単純なデータ型ソリューションよりも型クラス ソリューションを使用することによって引き起こされる複雑さが忍び寄る兆候です。OverlappingInstances
特に、物事を考えたり操作したりするのが難しくなる可能性があります。