【发布时间】:2020-09-24 18:55:50
【问题描述】:
有这样的问题:
cons(a, b)构造一对,car(pair)和cdr(pair)返回 该对的第一个和最后一个元素。例如,car(cons(3, 4))返回3,cdr(cons(3, 4))返回4。
现在,我已经看到了解决方案,但我想知道是否有人可以解释如何真正思考以达到解决方案?
-
cdr(cons(3, 4)):这两个函数的评估顺序是什么?我通常会认为cons(3, 4)首先被评估,但这在这种情况下没有意义,因为cons(3, 4)返回一个函数,其中参数 3 和 4 是“集成的”,所以没有办法挑选出参数。 - 在我看来
car(f)返回一个函数,那么cons(3, 4)怎么可能返回3呢? 编辑:错字,应该是car(cons(3, 4))而不是cons(3, 4) - 我显然想解决这个问题,因为我想学习 Python,但是你会建议我跳过这些问题吗?我很想在这里阅读:Why program functionally in Python?
解决方案:
def cons(a, b):
def pair(f):
return f(a, b)
return pair
def car(f):
def pair(a,b):
return a
return f(pair)
def cdr(f):
def pair(a, b):
return b
return f(pair)
print(car(cons(3,4)))
Output: 3
print(cdr(cons(3,4)))
Output: 4
【问题讨论】:
-
"...但在这种情况下这没有意义,因为
cons(3, 4)返回一个函数"。注意cdr的参数名称和使用方法。car也是如此。 -
这对初学者来说不是一个好的练习。嵌套函数的使用相当复杂,很难解释清楚。
-
这样的编码在现实世界中几乎从未做过。这与装饰器的工作方式有点相关,但比大多数都复杂。
-
@Carcigenicate:感谢您的帮助 :) 是的,我注意到了这一点,但我无法理解如何从已经“制造”的函数“f”中挑选出参数......对不起,我什至不知道如何解释自己
-
如果他们想让你学习 Lisp,为什么不教你 Lisp(或 Scheme)呢?当然,Python 是多范式的,但为什么要在其中重新发明 Lisp?
标签: python functional-programming cons cdr