const如何借助fix不动点组合器让多参数函数可迭代?
拆解fix和const组合的逻辑
先把核心定义摆清楚:
fix = f: let fixpoint = f fixpoint; in fixpoint const = a: b: a
先搞懂const的作用
const a b的逻辑特别简单——不管第二个参数b是什么,直接返回第一个参数a。比如const "hello" 123就返回"hello",const (x: x+1) "随便啥"就返回(x: x+1)这个函数。
再看fix的核心特性
fix f的本质是求函数f的「不动点」,也就是满足fix f = f (fix f)的那个值。简单说就是,你把fix f代入f的参数里,得到的结果还是fix f自己。
拆解第一个例子:fix (const (a: b: a + b)) 1 2
一步步展开:
- 先看
const (a: b: a + b)这个函数,它接受任意一个参数(比如这里后面会传入fix (const ...)),但根据const的特性,它直接返回第一个参数(a: b: a + b)。 - 代入fix的定义:
fix f = f (fix f),这里的f就是const (a: b: a + b),所以:fix (const (a: b: a + b)) = const (a: b: a + b) (fix (const (a: b: a + b))) - 右边的
const ...直接返回第一个参数,也就是(a: b: a + b),所以等式变成:fix (const (a: b: a + b)) = (a: b: a + b) - 最后调用这个函数传1和2,自然得到
1+2=3。
第二个例子同理
fix (const (a: b: c: a + b + c))最终会等于(a: b: c: a + b + c),传入1、2、3就得到1+2+3=6。
说白了,这里的fix就是被const「骗」了——const根本不关心fix传过来的参数,直接返回我们要的lambda函数,所以fix最终的结果就是那个lambda,和普通调用没区别。
内容的提问来源于stack exchange,提问作者toraritte
相关产品推荐
相关产品推荐

