我昨天回答了一个问题,这让我开始思考一个有趣的(对我来说)难题。
在仅使用lambda、数字和+
的限制下(没有if
、?:
或其他语言功能),目标是实现一些f
和一些g
,使得
// contract
f(x) => f'
g(y) => g'
f'(g') == g'(f')
// or more simply:
m(n) == n(m)
这是我迄今为止想到的 - 这段代码是用JavaScript编写的,目的是为了能够在浏览器中演示代码,但任何功能语言的答案都可以接受(racket、clojure、ocaml、lambda calc等)。
// f
const f = x => k =>
k(y => y + x)
// g
const g = y => k =>
k(x => x + y)
// make instance of each
const a = f(1)
const b = g(2)
console.log(a(b))
// x => x + y1
// should be 3
console.log(b(a))
// y => y + x2
// should be 3
f
和g
现在不对称,另一半仍然无法正常运作。
// f
const f = x => k =>
k(y => y(x))
// g
const g = y => k =>
k(x => x + y)
// make instance of each
const a = f(1)
const b = g(2)
console.log(a(b))
// 3
// should be 3 (OK)
console.log(b(a))
// y => y + x2
// should be 3
我知道为什么它不起作用,但是我尝试修复它时遇到了麻烦。最重要的是,如果无法修复,我想了解原因。
如果您有违规解决方案,我仍然很感兴趣 ^_^
const f = x => (fn = () => 0) => x + fn();
;) - user3297291