(( - >)a)的Applicative实例如何工作?

Mic*_*ent 2 haskell

给定于GHC.Base:

instance Applicative ((->) a) where
    pure = const
    (<*>) f g x = f x (g x)
    liftA2 q f g x = q (f x) (g x)
Run Code Online (Sandbox Code Playgroud)

怎么能有(<*>)三个论点的定义?我以为只花了两个.我该如何解析这个?

Ry-*_*Ry- 6

f <*> g是一个功能.定义

(<*>) f g x = f x (g x)
Run Code Online (Sandbox Code Playgroud)

与定义相同

(<*>) f g = \x -> f x (g x)
Run Code Online (Sandbox Code Playgroud)


Wil*_*sem 5

您可以使用正文中lambda表达式中的变量来交换函数头部中的变量.

例如:

f a b c d e = ...
Run Code Online (Sandbox Code Playgroud)

相当于:

f a b c d = \e -> ...
Run Code Online (Sandbox Code Playgroud)

要么

f a b c = \d e -> ...
f a b = \c d e -> ...
f a = \b c d e -> ...
f = \a b c d e -> ...
Run Code Online (Sandbox Code Playgroud)

(上述所有的).既然(<*>)有类型:

(<*>) :: Applicative f => f (b -> c) -> f b -> f c
Run Code Online (Sandbox Code Playgroud)

这意味着如果我们采取f ~ (->) a,那就意味着:

(<*>) :: (->) a (b -> c) -> (->) a b -> (->) a c  -- f ~ (->) a
Run Code Online (Sandbox Code Playgroud)

或更方便的语法:

(<*>) :: (a -> b -> c) -> (a -> b) -> (a -> c)
Run Code Online (Sandbox Code Playgroud)

或同等学历:

(<*>) :: (a -> b -> c) -> (a -> b) -> a -> c
Run Code Online (Sandbox Code Playgroud)

因此,这里(<*>)是三个参数的函数:f :: a -> b -> c,g :: a -> b,和x :: a.