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

如何手动推导Haskell中函数组合flip . const的类型?

手动推导Haskell函数组合flip . const的类型

嘿,我来一步步带你搞明白怎么手动推导这个类型,其实核心就是抓住函数组合的类型匹配规则,咱们慢慢来,别怕变量多~

首先,先明确几个基础类型:

  1. 函数组合运算符.的类型:

    (.) :: (c -> d) -> (a -> c) -> a -> d
    

    简单说就是:如果f的类型是c->d,g的类型是a->c,那f.g的类型就是a->d——因为g的输出正好能喂给f当输入。

  2. 已知的两个函数类型(为了避免和组合的变量冲突,我先把原类型的变量名换一下,后面再统一):

    flip :: (x -> y -> z) -> y -> x -> z
    const :: p -> q -> p  -- 等价于 p -> (q -> p),因为Haskell默认右结合
    

接下来开始匹配推导:

  • 我们要算的是flip . const,对应组合里的f = flip,g = const。
  • 首先把flip的类型和组合里的c->d对齐:
    flip的类型是(x -> y -> z) -> y -> x -> z,所以:
    • c = (x -> y -> z)(flip的输入类型)
    • d = y -> x -> z(flip的输出类型)
  • 然后把const的类型和组合里的a->c对齐:
    const的类型是p -> (q -> p),所以:
    • a = p(const的输入类型)
    • c = q -> p(const的输出类型)

现在关键来了:上面两个c是同一个东西,所以可以联立等式:
(x -> y -> z) = q -> p
根据Haskell的类型匹配规则,函数类型是逐段对应的:

  • 左边函数的参数x = 右边函数的参数q → x = q
  • 左边函数的返回值y -> z = 右边函数的返回值p → p = y -> z

现在把这些替换回组合的结果类型a->d:

  • a = p = y -> z
  • d = y -> x -> z,而x = q,不过咱们可以把变量名换成更直观的(和GHCi输出对齐):
    把y换成b,z换成c,q换成a,p换成b->c,这样:
    • a = b -> c
    • d = b -> a -> c

最终组合的类型就是a -> d,也就是:

(flip . const) :: (b -> c) -> b -> a -> c

和GHCi给出的结果完全一致!

总结一下核心思路:函数组合的本质是“后一个函数的输出作为前一个函数的输入”,所以推导时就是把两个函数的类型按这个规则对齐,联立变量等式,最后替换得到结果。

内容的提问来源于stack exchange,提问作者Николай Герасимов

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:55:17