Существуют ли «комбинаторы на уровне типов»? Будут ли они существовать в будущем?

По моему мнению, многое из того, что делает haskell действительно удобным в использовании, - это такие комбинаторы, как (.) , flip , $ <*> и т. Д. Такое ощущение, что я могу создать новый синтаксис, когда мне нужно.

Некоторое время назад я делал что-то, где было бы чрезвычайно удобно, если бы я мог «перевернуть» конструктор типа. Предположим, у меня есть конструктор типа:

m  :: * -> * -> * 

и что у меня есть класс MyClass , которому нужен тип с конструктором типа с видом * -> * . Естественно, я бы выбрал кодирование типа таким образом, чтобы я мог:

instance MyClass (m a) 

Но предположим, что я не могу изменить этот код, и предположим, что то, что действительно вписывается в MyClass , это что-то вроде

type w b = m b a 

instance MyClass w where 
    ...

а затем мне пришлось бы активировать XTypeSynonymInstances . Есть ли способ создать «комбинатор на уровне типов» Flip , чтобы я мог просто сделать:

instance MyClass (Flip m a)  where 
   ...

?? Или другие обобщения на уровне типов общих операторов, которые мы используем в haskell? Это вообще полезно или я просто бреду?

Редактировать:

Я мог бы сделать что-то вроде:

newtype Flip m a b = Flip (m b a)

newtype Dot m w a  = Dot m (w a)

...

Но тогда мне пришлось бы использовать конструкторы данных Flip , Dot , ... для шаблона сопоставление и т. д.Стоит ли оно того?

17
задан Rafael S. Calsaverini 23 November 2011 в 20:24
поделиться