Равенство ограничений

В принципе, при заданном {-# LANGUAGE PolymorphicKinds, ConstraintKinds, TypeFamilies #-} (и более, если необходимо), работает ли оператор уровня типа (~) с выражениями уровня типа типа Constraint? Я попытался найти ответ в Google, но безуспешно.


person Ptharien's Flame    schedule 08.03.2012    source источник
comment
Вопрос странный, но заданный хорошо. Из любопытства, что бы вы сделали с равенством ограничений?   -  person Daniel Wagner    schedule 08.03.2012
comment
@Daniel Wagner Я пишу кросс-парадигму EDSL, в которой используется общая система функций, и по разным причинам я не могу напрямую использовать классы типов. Я мог бы обойтись без этого, но это привело бы к чрезвычайно неуклюжим типам и, возможно, к некоторым ненужным ограничениям.   -  person Ptharien's Flame    schedule 08.03.2012


Ответы (1)


Да, это возможно. Поскольку типы вида 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"
person dflemstr    schedule 08.03.2012