2 回答
GHC 目前无法Typeable
为(,) :: Constraint -> Constraint -> Constraint
. 类型构造函数(,)
只有 kind * -> * -> *
。此类产品没有类型构造函数Constraint -> Constraint -> Constraint
。构造函数(,)
被重载以构造 s 的元组和乘积Constraint
,但在用于构造 s 的乘积时没有相应的类型构造函数Constraint
。
如果我们确实有一个用于Constraint
s 产品的类型构造函数,我们应该能够如下定义一个实例。为此,我们假设(,)
它也是一个带有 kind 的类型构造函数(,) :: Constraint -> Constraint -> Constraint
。要为它定义一个实例,我们将使用KindSignatures
和导入GHC.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 中的 hack,我们实际上无法为其创建实例(,) :: Constraint -> Constraint -> Constraint
我认为 Edward Kmett 所指的黑客是 s 的(,)
构造函数的重载,Constraint
而没有相应的类型构造函数。
目前看来是不可能的。最新版本的评论中有一个启发性的评论constraint
:
由于当前版本的 GHC 中对 (,) 类型的 hack,我们实际上无法为 (,) 创建实例 :: Constraint -> Constraint -> Constraint