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)
我不明白这一点。
从
\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)
| 归档时间: |
|
| 查看次数: |
99 次 |
| 最近记录: |