我可以为 - >写一个更高的订单类型吗? b - > *?

时间:2017-05-25 23:07:45

标签: haskell applicative higher-order-types

我了解(->) 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

这对于二进制(curried)函数的组合器很有用。

NB。也许这与Functors and Applicatives for types of kind (* -> *) -> *有关,但我不确定,因为它超越了我的头脑: - )

1 个答案:

答案 0 :(得分:12)

不,你不能。您可以想象许多语言功能来支持这一点;例如类型级lambda将是一个自然的:

instance Functor (\c. a -> b -> c) where ...

不幸的是,类型级lambdas意味着我们必须在类型推断期间从一阶统一转向高阶统一,这是非常困难的。 (我想说的是我头脑中的不可判断,但我不确定这一点。)

如果通过newtype包装器插入显式类型检查提示,则可以到达中途。标准的是Compose

a -> b -> c ~= Compose (a ->) (b ->) c
\c. a -> b -> c ~= Compose (a ->) (b ->)

事实上,Functor的{​​{1}}和Applicative实例恰好是Compose (a ->) (b ->)所期望的实例,代价是语法噪音时创建和使用此类型的值。