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
相关产品推荐
相关产品推荐

