私が達成したいのは、次のクラス ( SampleSpace
) のインスタンスは自動的に のインスタンスになることです。これは、文字列表現を作成するために必要なインターフェイス全体が含まれているShow
ためSampleSpace
、クラスのすべての可能なインスタンスが実質的に同一になるためです。
{-# LANGUAGE FlexibleInstances #-}
import Data.Ratio (Rational)
class SampleSpace space where
events :: Ord a => space a -> [a]
member :: Ord a => a -> space a -> Bool
probability :: Ord a => a -> space a -> Rational
instance (Ord a, Show a, SampleSpace s) => Show (s a) where
show s = showLines $ events s
where
showLines [] = ""
showLines (e:es) = show e ++ ": " ++ (show $ probability e s)
++ "\n" ++ showLines es
私がすでに知っているように、インスタンス宣言を一致させている間、GHC は制約ではなく頭だけを見ており、Show (s a)
Rational についても同様であると信じています:
[1 of 1] Compiling Helpers.Probability ( Helpers/Probability.hs, interpreted )
Helpers/Probability.hs:21:49:
Overlapping instances for Show Rational
arising from a use of ‘show’
Matching instances:
instance (Integral a, Show a) => Show (GHC.Real.Ratio a)
-- Defined in ‘GHC.Real’
instance (Ord a, Show a, SampleSpace s) => Show (s a)
-- Defined at Helpers/Probability.hs:17:10
In the expression: show
In the first argument of ‘(++)’, namely ‘(show $ probability e s)’
In the second argument of ‘(++)’, namely
‘(show $ probability e s) ++ "" ++ showLines es
質問: (インスタンスのオーバーラップを有効にする以外に) 型クラスの任意のインスタンスを自動的に別のインスタンスにすることは可能ですか?