关于join . (flip fmap)的类型与求值结果的技术问询
问题2:为什么h (\f -> f u) (\x -> x + v)总是得到u + 2v?
咱们把h的定义和具体参数一步步展开计算:
h = join . flip fmap,展开后等价于:h k = join (flip fmap k)- 先计算
flip fmap k(其中k = \f -> f u):flip fmap k就是\f -> f <$> k(flip fmap的参数顺序逻辑);- 对函数类型的函子,
f <$> k等价于\g -> f (k g)(Reader函子的fmap实现); - 代入
k = \f -> f u,得到\f g -> f (g u)。
- 再把结果传给
join:- Reader单子的
join逻辑是join f = \x -> f x x——它把嵌套函数r -> r -> a转换成接受单个参数的函数,将参数同时传给内层的两个函数位置; - 所以
join (\f g -> f (g u))就变成\f -> f (f u)。
- Reader单子的
- 最后代入第二个参数
\x -> x + v:- 替换
f为\x -> x + v,得到(\x -> x + v) ( (\x -> x + v) u ); - 先算内层:
(\x -> x + v) u = u + v; - 再算外层:
(\x -> x + v) (u + v) = (u + v) + v = u + 2v。
- 替换
整个过程就是函数嵌套调用的展开,最终结果自然是u + 2v。
内容的提问来源于stack exchange,提问作者Mark Wildon
相关产品推荐
相关产品推荐

