2 に答える
GHC は現在、 のTypeable
インスタンスやその他のインスタンスを作成できません(,) :: Constraint -> Constraint -> Constraint
。型コンストラクタ(,)
には kind しかありません* -> * -> *
。種類の製品の型コンストラクターはありませんConstraint -> Constraint -> Constraint
。コンストラクター(,)
は、タプルと s の積の両方を構築するためにオーバーロードされますが、sConstraint
の積を作成するために使用される場合、対応する型コンストラクターはありませんConstraint
。
s の積の型コンストラクタがあっConstraint
た場合、次のようにインスタンスを定義できるはずです。このために、(,)
も kind を持つ型コンストラクターであるふりをします(,) :: Constraint -> Constraint -> Constraint
。そのインスタンスを定義するには、KindSignatures
and importGHC.Exts.Constraint
を使用して、制約の種類について明示的に話せるようにします。
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE KindSignatures #-}
import GHC.Exts (Constraint)
import Data.Typeable
deriving instance Typeable ((,) :: Constraint -> Constraint -> Constraint)
ここでこれを行うと、(,)
型コンストラクターの種類が原因で、次のエラーが発生します。
The signature specified kind `Constraint
-> Constraint -> Constraint',
but `(,)' has kind `* -> * -> *'
In the stand-alone deriving instance for
`Typeable ((,) :: Constraint -> Constraint -> Constraint)'
制約パッケージは、制約の積でも機能し、次の注記が含まれています。
現在のバージョンの GHCのようなハッキングのため、
(,)
実際にはインスタンスを作成できません。(,) :: Constraint -> Constraint -> Constraint
Edward Kmett が言及しているハックは、対応する型コンストラクターがない sの(,)
コンストラクターのオーバーロードであると思います。Constraint
現状では出来ないようです。の最新バージョンには、明らかなコメントがありconstraint
ます。
現在のバージョンの GHC では (,) のハックのため、(,) のインスタンスを実際に作成することはできません :: Constraint -> Constraint -> Constraint