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

Haskell手动推导uncurry curry函数类型方法咨询

手动推导uncurry curry的函数类型

先明确基础函数的类型

首先得记住curry和uncurry这两个函数的原生类型,这是推导的基础:

  • curry的类型:((a, b) -> c) -> a -> b -> c
    简单说:它把一个需要元组当参数的函数,转换成分两次传参的柯里化函数。
  • uncurry的类型:(d -> e -> f) -> (d, e) -> f
    简单说:它和curry反过来,把柯里化的分参函数,转换成需要元组当参数的函数。

匹配参数类型,做替换推导

我们要计算的是uncurry curry——也就是把curry作为参数传给uncurry。这时候得把curry的类型和uncurry要求的参数类型对齐:

uncurry的第一个参数要求是d -> e -> f,而curry的类型是((a, b) -> c) -> a -> b -> c,所以两者可以一一对应:

  • d ↔ (a, b) -> c(curry的输入类型)
  • e ↔ a(curry返回的柯里化函数的第一个参数类型)
  • f ↔ b -> c(curry返回的柯里化函数的剩余部分类型)

接下来把这些对应关系代入uncurry的整体类型:(d -> e -> f) -> (d, e) -> f。当我们把curry传入uncurry后,uncurry curry的类型就是(d, e) -> f,替换后得到:
((a, b) -> c, a) -> b -> c

最后把变量名换成题目里的b1、b2(变量名只是占位符,不影响类型逻辑),就得到题目给出的最终类型:((b1, b2) -> c, b1) -> b2 -> c

用实例验证推导结果

举个实际例子验证:定义一个接受元组的加法函数addTuple :: (Int, Int) -> Int; addTuple (x,y) = x+y。
调用(uncurry curry) addTuple 3,得到的是一个Int -> Int类型的函数,再传4进去,结果就是7,和addTuple (3,4)的结果一致,完全符合我们推导的类型逻辑。

内容的提问来源于stack exchange,提问作者Gustav Persson Skytting

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 13:23:19