任意の制約の派生をHaskell値として得る方法はありません。
私が考えることができる最も近いことは、派生があなたの考えであるかどうかをチェックしたい場合、desugarerの出力を見ることです。
ghc -ddump-ds -ddump-to-file A.hs
関連部分は次のようになります。
-- RHS size: {terms: 2, types: 1, coercions: 0, joins: 0/0}
irred :: Show [Int]
[LclId]
irred = GHC.Show.$fShow[] @ Int GHC.Show.$fShowInt
-- RHS size: {terms: 2, types: 3, coercions: 0, joins: 0/0}
proof :: Dict (Show [Int])
[LclIdX]
proof = Cns.Dict @ (Show [Int]) irred
もう一つは、これはには適用されないタイプや値で、もちろんどちらか、導出を反映するために、インストルメントカスタム型クラスを書くことです既存の型クラス。
{-# LANGUAGE AllowAmbiguousTypes, ConstraintKinds, GADTs, DataKinds,
FlexibleInstances, KindSignatures, MultiParamTypeClasses, RankNTypes,
ScopedTypeVariables, TypeApplications, TypeOperators,
UndecidableInstances #-}
import Data.Typeable
import Data.Kind
data (c :: [Type]) :=> (d :: Type -> Constraint)
class MyShow a d where
myshow :: a -> String
instance (d ~ ('[] :=> MyShow Int)) => MyShow Int d where
instance (MyShow a da, d ~ ('[da] :=> MyShow [a])) => MyShow [a] d where
myshowInstance :: forall a d. (Typeable d, MyShow a d) => TypeRep
myshowInstance = typeRep @_ @d Proxy
main = print (myshowInstance @[Int])
出力ではなくTypeRep
の適切なレンダリング方法でシングルトンを経由して、例えば、良く見えるように作ることができるが、私はあなたがメインのアイデアを得る願っています。
:=> (': * (:=> ('[] *) (MyShow Int)) ('[] *)) (MyShow [Int])
これは実際に楽しい演習になるでしょう! – nicolas