2

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

4

1 回答 1

3

不,目前是不可能的。Haskell 的类型系统有一些限制,使其在大多数情况下都很有用和方便,这就是这些限制之一。您最好的选择是使用新类型。

newtype FuncFlip r a = FuncFlip { unFuncFlip :: a -> r }

新类型只是帮助编译器知道如何进行类型检查和正确执行类型定向调度(类型类)的标记。大概您想翻转类型参数以提供一些类型类实例。这只是意味着,每当您想使用该类型类的功能时,您必须用 装饰任何特定的输入FuncFlip,并使用 取消装饰任何特定的输出unFuncFlip。这比预期的要冗长一些,但实际上并没有那么糟糕,因为它迫使您明确识别要使用的类型类的哪个实例。

您可以为此创建一个Newtype实例,这可能对您来说很方便,也可能不方便。

instance Newtype (FuncFlip r a) (a -> r) where
  pack = FuncFlip
  unpack = unFuncFlip

进一步阅读:是否有“类型级组合?”

于 2012-05-23T20:19:13.580 回答