5
4

2 回答 2

5

GHC 目前无法Typeable(,) :: Constraint -> Constraint -> Constraint. 类型构造函数(,)只有 kind * -> * -> *此类产品没有类型构造函数Constraint -> Constraint -> Constraint。构造函数(,)被重载以构造 s 的元组和乘积Constraint,但在用于构造 s 的乘积时没有相应的类型构造函数Constraint

如果我们确实有一个用于Constraints 产品的类型构造函数,我们应该能够如下定义一个实例。为此,我们假设(,)它也是一个带有 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而没有相应的类型构造函数。

于 2014-09-17T15:59:20.843 回答
2

目前看来是不可能的。最新版本的评论中有一个启发性的评论constraint

由于当前版本的 GHC 中对 (,) 类型的 hack,我们实际上无法为 (,) 创建实例 :: Constraint -> Constraint -> Constraint

于 2014-09-17T15:52:08.360 回答