8
基本上,给定{-# LANGUAGE PolymorphicKinds, ConstraintKinds, TypeFamilies #-}
(以及更多,如有必要),(~)
类型级别的操作符是否可以处理类型为Constraint
的表达式?我试着用Google搜索答案,但没有运气。约束上的平等
基本上,给定{-# LANGUAGE PolymorphicKinds, ConstraintKinds, TypeFamilies #-}
(以及更多,如有必要),(~)
类型级别的操作符是否可以处理类型为Constraint
的表达式?我试着用Google搜索答案,但没有运气。约束上的平等
是的,这是可能的。因为种类Constraint
是有限的原子类型约束集,所以可以非常容易地测试它们的相等性。
但是,PolyKinds
扩展名不是必需的。此外,这种平等实际上很有用的情况很少,因为我没有看到作为参数c1
,c2
到Bla
传递多态约束的实际方法,所以约束相等在每种情况下都是重言式(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"
这个问题很奇怪,但问得好。出于好奇,你会用约束平等做什么? – 2012-03-08 19:28:37
@Daniel Wagner我正在编写一个使用通用函数系统的跨范例EDSL,并且由于各种原因,我无法直接使用类型类。我可以逃避不使用这个,但它会导致非常笨重的类型和可能的一些不必要的限制 – 2012-03-08 19:38:04