5
4

2 に答える 2

5

GHC は現在、 のTypeableインスタンスやその他のインスタンスを作成できません(,) :: Constraint -> Constraint -> Constraint。型コンストラクタ(,)には kind しかありません* -> * -> *種類の製品の型コンストラクターはありませんConstraint -> Constraint -> Constraint。コンストラクター(,)は、タプルと s の積の両方を構築するためにオーバーロードされますが、sConstraintの積を作成するために使用される場合、対応する型コンストラクターはありませんConstraint

s の積の型コンストラクタがあっConstraintた場合、次のようにインスタンスを定義できるはずです。このために、(,)も kind を持つ型コンストラクターであるふりをします(,) :: Constraint -> Constraint -> Constraint。そのインスタンスを定義するには、KindSignaturesand 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

于 2014-09-17T15:59:20.843 に答える
2

現状では出来ないようです。の最新バージョンには、明らかなコメントがありconstraintます。

現在のバージョンの GHC では (,) のハックのため、(,) のインスタンスを実際に作成することはできません :: Constraint -> Constraint -> Constraint

于 2014-09-17T15:52:08.360 に答える