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 ->)