如何理解 \gx -> fmap ($) gx 中的函子

tkr*_*krd 1 haskell functor map-function

我是 Haskell 的初学者。我知道该函数fmap接受两个参数 ( (a->b) -> f a ->) 并返回一个函子 ( f b),但我无法理解以下 lambda 表达式

*Main> :t \g x -> fmap ($) g x
\g x -> fmap ($) g x :: (t -> a -> b) -> t -> a -> b
Run Code Online (Sandbox Code Playgroud)

函子在哪里?

顺便说一句,我尝试了几个带有不同括号的类似表达式,它们给出了不同的结果:

*Main> :t \g x -> fmap ($) (g x)
\g x -> fmap ($) (g x) :: Functor f => (t -> f (a -> b)) -> t -> f (a -> b)

*Main> :t \g x -> fmap $ g x
\g x -> fmap $ g x :: Functor f => (t -> a -> b) -> t -> f a -> f b
Run Code Online (Sandbox Code Playgroud)

我不明白这一点。

chi*_*chi 7

\g x -> fmap ($) g x :: (t -> a -> b) -> t -> a -> b
Run Code Online (Sandbox Code Playgroud)

我们有

g            :: t -> a -> b
x            :: t
fmap ($) g   :: t -> a -> b
fmap ($) g x :: a -> b
Run Code Online (Sandbox Code Playgroud)

要找到函子,只需将 的类型编写为some和的g类型级应用程序即可。F XFX

我们有

t -> a -> b    =    (->) t (a -> b)
Run Code Online (Sandbox Code Playgroud)

因此,F = (->) t并且X = (a -> b).

因此,该fmap调用在函子中起作用(->) t。我们需要将 to 视为函子下“包装”t -> a -> b类型的值。a -> b(->) t

现在,我们有

($) :: (a->b) -> a -> b
-- which means
($) :: (a->b) -> (a -> b)

g   :: F (a->b)
fmap ($) :: F (a->b) -> F (a->b)
fmap ($) g :: F (a->b)
-- i.e.
fmap ($) g :: t -> (a->b)
Run Code Online (Sandbox Code Playgroud)