Haskell中Functor里<$ = (fmap . const)的工作原理是什么?
解析
(fmap . const)的工作原理 要搞懂(fmap . const)的逻辑,得从柯里化和函数组合的类型推导入手,一步步拆解:
先明确各函数的类型(换参数名避免混淆)
- 函数组合运算符:
(.) :: (b -> c) -> (a -> b) -> a -> c fmap:Functor f => (x -> y) -> f x -> f y(柯里化后,它是一个接收(x->y)函数、返回f x -> f y的函数)const:p -> q -> p(柯里化后,是接收p、返回q -> p的函数)
推导(fmap . const)的类型
函数组合(.) f g的本质是\x -> f (g x),把fmap和const代入组合逻辑:
把
fmap作为(.)的第一个参数,对应(b -> c)。此时fmap的类型是(x->y) -> (f x -> f y),所以:b = x -> yc = f x -> f y
这时候(.) fmap的类型就变成:(a -> (x -> y)) -> a -> (f x -> f y)
再把
const作为(.) fmap的参数,对应(a -> (x -> y))。const的类型是p -> (q -> p)(柯里化右结合),所以:a = px -> y = q -> p→ 即x = q,y = p
把这些对应关系代入,最终
(fmap . const)的类型就是:p -> f q -> f p
看具体例子(fmap . const) 2 (Just 4)
按照组合逻辑展开,这个表达式等价于:
fmap (const 2) (Just 4)
- 第一步:
(fmap . const) 2是把2传给const,得到部分应用的函数const 2(类型Int -> Int),再把这个函数传给fmap,得到fmap (const 2)(类型Maybe Int -> Maybe Int) - 第二步:把
Just 4传给fmap (const 2),fmap会把const 2应用到Just包裹的4上——不管输入是啥,const 2都返回2,所以最终结果是Just 2
你之前的误解在于,以为const会直接返回2给fmap,但实际上因为Haskell的函数都是柯里化的,const先被部分应用成了一个单参数函数const 2,这个函数才是fmap真正需要的第一个参数——这也是函数组合能正常工作的核心原因。
内容的提问来源于stack exchange,提问作者Akari
相关产品推荐
相关产品推荐

