在Haskell中是否可以将函数箭头类型构造函数( - >)仅应用于其右侧类型(例如:( - > a))以获得类型的类型构造函数* - > *?
答案 0 :(得分:3)
不,目前还不可能。 Haskell的类型系统存在某些限制,使其对大多数情况都有用且方便,这是其中一个限制。您最好的选择是使用新类型。
newtype FuncFlip r a = FuncFlip { unFuncFlip :: a -> r }
Newtypes只是帮助编译器知道如何正确检查和执行类型导向调度(类型类)的标签。大概你想翻转类型参数来提供一些类型类实例。这只是意味着每当你想要使用类型类的函数时,你必须使用FuncFlip
修饰任何特定的输入,并使用unFuncFlip
取消任何特定的输出。这比想要的更冗长,但实际上并不是那么糟糕,因为它会强制您明确识别要使用的类型类的哪个实例。
您可以为此创建一个Newtype的实例,这可能会也可能不会对您有所帮助。
instance Newtype (FuncFlip r a) (a -> r) where
pack = FuncFlip
unpack = unFuncFlip