Большая часть того, что делает 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? Это даже полезно, или я просто бессвязно?
Edit:
Я мог бы сделать что-то вроде:
newtype Flip m a b = Flip (m b a)
newtype Dot m w a = Dot m (w a)
...
Но тогда мне придется использовать конструкторы данных flip
, Dot
,... для сопоставления шаблонов и т.д. Стоит ли это?