在我看来,使haskell 真正好用的大部分是组合符,例如,(.)
等。感觉就像我可以在需要时创建新语法一样。flip
$
<*>
前段时间我正在做一些事情,如果我可以“翻转”一个类型构造函数,那将非常方便。假设我有一些类型构造函数:
m :: * -> * -> *
并且我有一个类MyClass
需要一个带有 kind 类型构造函数的类型* -> *
。自然,我会选择以我可以做到的方式对类型进行编码:
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
, ... 来进行模式匹配等。值得吗?