【发布时间】:2017-11-02 00:36:11
【问题描述】:
在 Haskell 中,(<*>) 运算符的默认实现(它将函数 a->b 的应用程序应用于 a 的应用程序,从而导致 b 的应用程序)在 Control.Applicative 中定义为 -
(<*>) :: f (a -> b) -> f a -> f b
(<*>) = liftA2 id
我根本无法理解它是如何工作的。
liftA2 的类型为liftA2 :: (a -> b -> c) -> f a -> f b -> f c,这意味着它需要一个二进制函数,而id 不是。根据我的理解,这意味着 id 以某种方式被解释为某种更复杂的类型——但我不确定是哪个或如何使这个定义起作用。如果有人可以解释一下id 解释为什么类型(id :: a -> a 定义中的a 代表什么类型),并了解它如何产生一个函数,该函数采用函数的应用程序和值的应用程序并应用它们,我将非常感激。
【问题讨论】:
-
->是右结合。a -> b -> c表示a -> (b -> c)。 -
请注意,
($)=id,仅用于不太通用的类型。该代码可以更清楚地写成ap = liftA2 ($)。
标签: haskell functional-programming