Haskell の次の単純なコードに問題があります。
import Prelude hiding (cycle).
class ICycle a where
cycle :: a -> a
instance ICycle [a] where
cycle [] = []
cycle (x:xs) = xs ++ [x]
instance ICycle Bool where
cycle True = False
cycle False = True
instance Num a => ICycle a where
cycle n = n+1
main = do
print $ cycle $ [1,2,3]
print $ cycle $ True
print $ cycle $ 42
ここで、最初の 2 つのインスタンス宣言は期待どおりに機能しますが、3 番目のインスタンス宣言は、フラグの組み合わせに応じてさまざまな種類のエラーを引き起こします。
Num a
よりも短くないことがわかっているICycle a
ため、コンパイラは型チェックを終了できません。例では、右辺をより大きな用語にするか、最初に目的のクラスを他のクラスのサブクラスとして宣言することで、これを回避できることを確認しました。ここでは逆に、既存のクラスを新しいクラスのサブクラスとして宣言したいと考えています。
このような型クラスの使用に異議があるのだろうか。または、自然な解決策がある場合。