You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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代入组合逻辑:

  1. 把fmap作为(.)的第一个参数,对应(b -> c)。此时fmap的类型是(x->y) -> (f x -> f y),所以:

    • b = x -> y
    • c = f x -> f y
      这时候(.) fmap的类型就变成:(a -> (x -> y)) -> a -> (f x -> f y)
  2. 再把const作为(.) fmap的参数,对应(a -> (x -> y))。const的类型是p -> (q -> p)(柯里化右结合),所以:

    • a = p
    • x -> y = q -> p → 即x = q,y = p
  3. 把这些对应关系代入,最终(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 12:33:25