给定于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)
怎么能有(<*>)三个论点的定义?我以为只花了两个.我该如何解析这个?
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)
您可以使用正文中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.