Haskell仅将函数箭头应用于结果类型?
-
13-12-2019 - |
题
是否有可能在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
进一步阅读: 是否有"类型级组合"?"
不隶属于 StackOverflow