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