Tob*_*bia 11 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
Run Code Online (Sandbox Code Playgroud)
这对于二进制(curried)函数的组合器很有用.
NB.也许这是相关类型的Functors和Applicative(* - >*) - >*但我不确定,因为它超出了我的头:-)
Dan*_*ner 12
不,你不能.您可以想象许多语言功能来支持这一点; 例如,类型级lambda将是一个自然的:
instance Functor (\c. a -> b -> c) where ...
Run Code Online (Sandbox Code Playgroud)
不幸的是,类型级lambdas意味着我们必须在类型推断期间从一阶统一转向高阶统一,这是非常困难的.(我想说从头顶看不可判,但我不确定.)
如果通过newtype包装器插入显式类型检查提示,则可以到达中途.标准的是Compose:
a -> b -> c ~= Compose (a ->) (b ->) c
\c. a -> b -> c ~= Compose (a ->) (b ->)
Run Code Online (Sandbox Code Playgroud)
实际上,在创建和使用此类型的值时,以及一些语法噪声为代价的实例Functor和Applicative实例Compose (a ->) (b ->)正是您所期望的\c. a -> b -> c.