У меня есть семейство "линейного" типа, т.е. вида
type family Foo a
type instance Foo T1 = T2
type instance Foo T2 = T3
...
type instance Foo T9 = T10
В моем частном случае использования очень удобно определить "обратное" семейство FooRev
, а затем применить ограничение (FooRev (Foo x) ~ x)
:
type family FooRev a
type instance FooRev T10 = T9
type instance FooRev T9 = T8
...
type instance FooRev T2 = T1
Обратное семейство позволяет GHC выводить множество типов, которые в противном случае были бы неоднозначными из-за неинъективности. По сути, это та же идея, что была предложена здесь. Это решение работает довольно хорошо, но необходимость определять «обратное» семейство типов, перечисляя все случаи, раздражает, программно и подвержено ошибкам. Есть ли более общий способ определить обратную сторону линейного семейства, например Foo
?
data
семейства, которые известны как инъективные. Не уверен, подходит ли это к вашей проблеме. - person luqui   schedule 24.10.2014map swap
и получить оба семейства типов из списка. - person chi   schedule 24.10.2014Ti
относятся к типуBar a b c
, параметры которого меняются. Это не вписывается в семейство данных, не так ли? - person crockeea   schedule 24.10.2014