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

Haskell是否仅将函数箭头应用于结果类型?,haskell,types,type-kinds,Haskell,Types,Type Kinds,在Haskell中,是否可以将函数arrow类型构造函数(->)仅应用于其右侧类型(例如:(->a)),以获得类型为*->*的类型构造函数 不,目前不可能。Haskell的类型系统存在某些限制,使其在大多数情况下都非常有用和方便,这就是这些限制之一。最好的选择是使用新类型 newtype FuncFlip r a = FuncFlip { unFuncFlip :: a -> r } Newtypes只是帮助编译器知道如何正确地进行类型检查和执行类型定向分派(TypeClass)的标记。

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

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

newtype FuncFlip r a = FuncFlip { unFuncFlip :: a -> r }
Newtypes只是帮助编译器知道如何正确地进行类型检查和执行类型定向分派(TypeClass)的标记。您可能希望翻转类型参数以提供某种类型类实例。这只是意味着,无论何时,只要您想使用该typeclass的函数,就必须使用
FuncFlip
装饰任何特定的输入,并使用
unFuncFlip
取消装饰任何特定的输出。这比期望的要详细一些,但实际上并没有那么糟糕,因为它迫使您显式地标识要使用的typeclass实例

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

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

进一步阅读:

是的,我宁愿避免这样做,因为那样会使事情变得更复杂。我几乎可以肯定我已经看过了。结果是,是的,我确实需要一个新的类型。如果你把它作为一个答案贴出来,我会接受它,这样你就可以得到学分。(->)a或只是
((->)a
对于某些
a
有种类
*->*
@htbta它有正确的种类,但它不满足另一个约束:他想将
(>)
应用于它的第二个参数,而不是第一个。@Daniel Wagner GHC有
(>)::*->*->*->*->*->*
(,)::*->*->*带有部分类型级别的应用程序
(>)a::*->*
(,)a::*->*
,但没有类型级别的节(例如
(a->)
(>a)
(a,)
(,a)
)或类型级别的lambdas(例如
)(
)。因此,使用
newtype
是唯一的选择。