使用任意"约束别名"派生子句?

sam*_*lis 5 haskell

例如,此声明包含deriving:

{-# LANGUAGE DeriveDataTypeable, ConstraintKinds #-}
import Data.Data (Data)
import Data.Typeable (Typeable)

type Constraints a = (Show a, Eq a, Ord a, Data a, Typeable a)
data A = A deriving (Constraints)
Run Code Online (Sandbox Code Playgroud)

错误:

Illegal deriving item ‘Constraints’
Run Code Online (Sandbox Code Playgroud)

这对http://downloads.haskell.org/~ghc/7.8.3/docs/html/users_guide/deriving.html有意义

deriving (Show, Eq, Ord, Data, Typeable)为大部分类型写作.导出标准的"约束别名",即任何类型的类型可能会很好* -> Constraint.当然,给定约束元组中的约束都是正确的arity,具有空的"最小完整定义"等.

对此有什么建议吗?这有多难?还有替代品吗?

scl*_*clv 3

没有这方面的建议。这不会太难,但我怀疑它不会有太大的吸引力。您不仅可以使用模板 haskell 生成独立的派生声明(如注释所示),而且如果您确实愿意,还可以使用 CPP 宏扩展到所需的子句。