Это дополнительный вопрос к этому вопросу, где ответ, частично применяющий оператор типа (~)
, допустимый.
Рассмотрим следующее (глупое) семейство типов:
type family SillyT a b :: Constraint
data D (c :: * -> Constraint) where
D :: Proxy c -> D c
Тогда что-то вроде этого недействительно:
D (Proxy :: (Proxy (SillyT Int)))
Но если я оберну SillyT
в такой класс:
class SillyT a b => SillyC a b
instance SillyT a b => SillyC a b
Тогда я могу сделать это:
D (Proxy :: (Proxy (SillyC Int)))
И все работает нормально. Однако обертывание в классе кажется немного глупым и повторяющимся, но единственный ли это способ частично применить семейство типов?
=>
. - person Rodrigo Ribeiro   schedule 01.03.2017Constraint
, если все экземпляры типа являются ограничениями? Например, сказатьtype instance SillyT Int a = Num a
, чтобы привести глупый пример. - person Clinton   schedule 01.03.2017instance SillyT Int a = Num a
, тоSillyC Int
не сводится кNum
. В этом операционное различие между семействами и конструкторами инъективных типов (т. е.data
,newtype
иclass
) — первые уменьшаются сразу, но не могут быть частично применены, а вторые уменьшаются только при полном применении, но «частичные применения» допустимы, но только в том смысле, что частичное приложение является синтаксически допустимым типом. - person user2407038   schedule 01.03.2017