2012-03-08 101 views
8

基本上,给定{-# LANGUAGE PolymorphicKinds, ConstraintKinds, TypeFamilies #-}(以及更多,如有必要),(~)类型级别的操作符是否可以处理类型为Constraint的表达式?我试着用Google搜索答案,但没有运气。约束上的平等

+1

这个问题很奇怪,但问得好。出于好奇,你会用约束平等做什么? – 2012-03-08 19:28:37

+0

@Daniel Wagner我正在编写一个使用通用函数系统的跨范例EDSL,并且由于各种原因,我无法直接使用类型类。我可以逃避不使用这个,但它会导致非常笨重的类型和可能的一些不必要的限制 – 2012-03-08 19:38:04

回答

6

是的,这是可能的。因为种类Constraint是有限的原子类型约束集,所以可以非常容易地测试它们的相等性。

但是,PolyKinds扩展名不是必需的。此外,这种平等实际上很有用的情况很少,因为我没有看到作为参数c1,c2Bla传递多态约束的实际方法,所以约束相等在每种情况下都是重言式(Show ~ Show这里):

{-# LANGUAGE ConstraintKinds, TypeFamilies #-} 

type Bla c1 c2 a = (c1 a, c2 a, c1 ~ c2) 

foo :: Bla Show Show a => a -> IO() 
foo = print 

main = foo "Bla"