Haskell 我可以为a->;编写更高阶的类型吗;b->;*?

Haskell 我可以为a->;编写更高阶的类型吗;b->;*?,haskell,applicative,higher-order-types,Haskell,Applicative,Higher Order Types,我知道(>)a是一种高阶类型*->*,当应用于类型参数b时,给出类型a->b 我可以写一种类型的*->*,当应用于c时,它会给出a->b->c 若否,原因为何?可能使用一些语言扩展和进行所有 这将允许我编写Functor和Applicationive(以及其他类)的实例,其中函数结构为“a->b->”,如所示: ()::应用程序t=>t(c->d)->tc->td ()::(a->b->c->d)->(a->b->c)->a->b->d 这对于二进制(curried)函数的组合器很有用 注意。

我知道
(>)a
是一种高阶类型
*->*
,当应用于类型参数
b
时,给出类型
a->b

我可以写一种类型的
*->*
,当应用于
c
时,它会给出
a->b->c

若否,原因为何?可能使用一些语言扩展和
进行所有

这将允许我编写Functor和Applicationive(以及其他类)的实例,其中函数结构为“
a->b->
”,如所示:

()::应用程序t=>t(c->d)->tc->td
()::(a->b->c->d)->(a->b->c)->a->b->d
这对于二进制(curried)函数的组合器很有用


注意。也许这是有关系的,但我不确定,因为它超出了我的想象:-)

不,你不能。您可以想象许多语言特性支持这一点;e、 g.类型级别的lambda将是自然的:

instance Functor (\c. a -> b -> c) where ...
不幸的是,类型级别的lambdas意味着我们必须在类型推理过程中从一阶统一移动到高阶统一,这非常困难。(我想直截了当地说不可判定,但我对此不确定。)

如果通过
newtype
包装器插入显式类型检查提示,则可以达到一半。标准之一是:


事实上,
Compose(a->)(b->)
函子和
Applicative
实例正是您所期望的
\c。a->b->c
,在创建和使用此类型的值时会产生一些语法噪音。

以实现此功能的语言为例,Agda具有类型级别(和种类级别等)函数。谢谢。现在一切都很清楚了。使用Compose,我能够使用Functor和Applicative组合二进制函数:
getCompose((,)Compose(+)Compose(-))72
=
(9,5)
instance Functor (\c. a -> b -> c) where ...
a -> b -> c ~= Compose (a ->) (b ->) c
\c. a -> b -> c ~= Compose (a ->) (b ->)