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

有帮助吗?

解决方案

不,目前是不可能的。Haskell的类型系统有一定的限制,允许它在大多数情况下有用和方便,这就是其中的一个限制。你最好的选择是使用newtype。

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

Newtypes只是帮助编译器知道如何正确地键入和执行类型定向调度(typeclasses)的标签。大概你想翻转类型参数以提供一些类型类实例。这只是意味着每当你想使用该类型类的函数时,你必须用任何特定的输入来装饰 FuncFlip, ,并用 unFuncFlip.这比预期的要详细一些,但实际上并没有那么糟糕,因为它迫使你明确地识别你想要使用的类型类的哪个实例。

您可以创建 新类型 为此,这可能会或可能不会对您方便。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top