2012-03-08 58 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"