Haskell仅将函数箭头应用于结果类型?

时间:2012-05-22 19:38:59

标签: haskell types type-kinds

在Haskell中是否可以将函数箭头类型构造函数( - >)仅应用于其右侧类型(例如:( - > a))以获得类型的类型构造函数* - > *?

1 个答案:

答案 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

进一步阅读:Are there "type-level combinatos?"