По моему мнению, многое из того, что делает 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
, ... для шаблона сопоставление и т. д.Стоит ли оно того?