2

我正在尝试使用基于 SICP 的在线课程自学 Python 和 CS。我了解教堂数字的基础知识,但是在 python 中使用 lambda 函数添​​加教堂数字时遇到了麻烦。

这是我的上下文代码:

def zero(f):
    return lambda x: x


def successor(n):
    return lambda f: lambda x: f(n(f)(x))


def one(f):
    """Church numeral 1."""
    return lambda x: f(x)


def two(f):
    """Church numeral 2."""
    return lambda x: f(f(x))


def church_to_int(n):
    """Convert the Church numeral n to a Python integer.

    >>> church_to_int(zero)
    0    
    >>> church_to_int(one)
    1
    >>> church_to_int(two)
    2
    """
    return n(lambda x: x + 1)(0)


def mul_church(m, n):
    """Return the Church numeral for m * n, for Church numerals m and n.

    >>> three = successor(two)
    >>> four = successor(three)
    >>> church_to_int(mul_church(two, three))
    6
    >>> church_to_int(mul_church(three, four))
    12
    """
    return lambda x: m(n(x))

这是我遇到问题的 add_church 函数:

def add_church(m, n):
    """Return the Church numeral for m + n, for Church numerals m and n.
    >>> three = successor(two)
    >>> church_to_int(add_church(two, three))
    5
    """
    return lambda f: lambda x: m(f(x))(n(x))

我得出的结论是,添加教堂数字的一种方法是以某种方式让 add_church(m, n) 中的一个函数成为另一个 lambda 函数中的输入或“x”。但是,我不断收到错误,表明我在函数调用中没有使用正确的参数。

例如,当我打电话时:

church_to_int(add_church(one, two))

我得到一个“int object not callable”错误,并且还尝试了其他不同的方法但没有成功。

我认为我没有看到关于 lambda 函数的一些东西,这导致我在实现 add_church 时遇到了麻烦。我已经花了一段时间来解决这个问题,所以任何能引导我找到答案的帮助都将不胜感激。

4

1 回答 1

3

回想一下,Church 编码可以理解为将函数重复应用于参数。因此,要添加m + n,我们需要将函数f应用于参数x m + n次,或者等效地应用它n次,然后再应用它m次:

def add_church(m, n):
    def m_plus_n(f):
        def f_repeated_m_plus_n_times(x)                # f ** (m + n)
            intermediate_result = (n(f))(x)             # (f ** n) (x)
            final_result = (m(f))(intermediate_result)  # (f ** m) ((f ** n) (x))
            return final_result
        return f_repeated_m_plus_n_times
    return m_plus_n

在 lambda 形式中,删除多余的括号:

def add_church(m, n):
    """Return the Church numeral for m + n, for Church numerals m and n.
    >>> three = successor(two)
    >>> church_to_int(add_church(two, three))
    5
    """
    lambda f: lambda x: m(f)(n(f)(x))
于 2014-07-23T08:40:59.573 回答