我可以为 a -> b -> * 写一个高阶类型吗?
Can I write a higher order type for a -> b -> *?
我知道 (->) a
是类型 * -> *
的高阶类型,当应用于类型参数时 b
给出类型 a -> b
我可以写一种类型 * -> *
应用于 c
时会得到 a -> b -> c
吗?
如果不是,为什么不呢?也许使用一些语言扩展和 forall
?
这样我就可以编写 Functor 和 Applicative(以及其他 类)的实例,其中函子结构是“a -> b ->
”,如:
(<*>) :: Applicative t => t (c -> d) -> t c -> t d
(<*>) :: (a -> b -> c -> d) -> (a -> b -> c) -> a -> b -> d
这对于二元(柯里化)函数的组合器很有用。
注意。也许这与 Functors and Applicatives for types of kind (* -> *) -> * 有关,但我不确定,因为它超出了我的头脑:-)
不,你不能。您可以想象许多语言功能来支持这一点;例如类型级别的 lambda 将是一个自然的:
instance Functor (\c. a -> b -> c) where ...
不幸的是,类型级 lambda 意味着我们必须在类型推断期间从一阶统一转移到高阶统一,这非常困难。 (我想说无法确定,但我不确定。)
如果您通过 newtype
包装器插入显式类型检查提示,您就可以做到一半。标准的是 Compose
:
a -> b -> c ~= Compose (a ->) (b ->) c
\c. a -> b -> c ~= Compose (a ->) (b ->)
而且,事实上,Compose (a ->) (b ->)
的 Functor
和 Applicative
实例正是您所期望的 \c. a -> b -> c
实例,但代价是一些句法创建和使用此类值时的噪音。
我知道 (->) a
是类型 * -> *
的高阶类型,当应用于类型参数时 b
给出类型 a -> b
我可以写一种类型 * -> *
应用于 c
时会得到 a -> b -> c
吗?
如果不是,为什么不呢?也许使用一些语言扩展和 forall
?
这样我就可以编写 Functor 和 Applicative(以及其他 类)的实例,其中函子结构是“a -> b ->
”,如:
(<*>) :: Applicative t => t (c -> d) -> t c -> t d
(<*>) :: (a -> b -> c -> d) -> (a -> b -> c) -> a -> b -> d
这对于二元(柯里化)函数的组合器很有用。
注意。也许这与 Functors and Applicatives for types of kind (* -> *) -> * 有关,但我不确定,因为它超出了我的头脑:-)
不,你不能。您可以想象许多语言功能来支持这一点;例如类型级别的 lambda 将是一个自然的:
instance Functor (\c. a -> b -> c) where ...
不幸的是,类型级 lambda 意味着我们必须在类型推断期间从一阶统一转移到高阶统一,这非常困难。 (我想说无法确定,但我不确定。)
如果您通过 newtype
包装器插入显式类型检查提示,您就可以做到一半。标准的是 Compose
:
a -> b -> c ~= Compose (a ->) (b ->) c
\c. a -> b -> c ~= Compose (a ->) (b ->)
而且,事实上,Compose (a ->) (b ->)
的 Functor
和 Applicative
实例正是您所期望的 \c. a -> b -> c
实例,但代价是一些句法创建和使用此类值时的噪音。