Многое из того, что делает haskell действительно хорошим для использования, на мой взгляд, это комбинаторы, такие как (.)
, flip
, $
<*>
и т. Д. Похоже, я могу создать новый синтаксис, когда мне это нужно.
Некоторое время назад я делал что-то, что было бы чрезвычайно удобно, если бы я мог «перевернуть» конструктор типов.Предположим, у меня есть конструктор типа:
m :: * -> * -> *
, и у меня есть класс MyClass
, которому нужен тип с конструктором типа вида * -> *
.Естественно, я бы предпочел закодировать тип таким образом, чтобы я мог сделать:
instance MyClass (m a)
Но предположим, что я не могу изменить этот код, и предположим, что то, что действительно вписывается в MyClass
, выглядит как1016 *
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
, ..вокруг для сопоставления с образцом и т. д. Стоит ли это?