Равенство по ограничениям - PullRequest
8 голосов
/ 08 марта 2012

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

1 Ответ

6 голосов
/ 08 марта 2012

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