4

私が達成したいのは、次のクラス ( 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

質問: (インスタンスのオーバーラップを有効にする以外に) 型クラスの任意のインスタンスを自動的に別のインスタンスにすることは可能ですか?

4

1 に答える 1