在我看来,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
等。这样值得吗?