Haskell将功能箭头仅应用于结果类型吗?

Haskell apply function arrow to only result type?

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


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

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

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

您可以为此创建一个Newtype实例,这可能会或可能不会为您带来方便。

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

进一步阅读:是否有"类型级别组合"?