2014-07-23 3 views
2

나는 SICP를 기반으로 한 코스를 온라인으로 사용하여 파이썬과 CS를 배우려고합니다. 나는 교회 숫자의 기초를 이해하지만 파이썬에서 람다 함수를 사용하여 교회 숫자를 추가하는 데 어려움을 겪고있다.파이썬에서 람다 함수를 사용하여 교회 숫자 추가하기

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 기능이

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 (m, n)의 함수 중 하나를 입력으로 사용하거나 다른 함수의 "x"를 사용합니다. 그러나 함수 호출에서 올바른 인수를 사용하지 않는다는 의미의 오류가 계속 발생합니다. 내가 전화

예를 들어

:

church_to_int(add_church(one, two)) 

나는 다른 사람의 사이에 "int 객체 호출 할 수 없습니다"오류 얻을 또한 성공없이 다른 여러 가지 방법을 시도했습니다.

나는 람다 함수가 add_church를 구현하는 데 문제가 있다는 것을 알지 못한다고 생각합니다. 나는 이것을 알아내는 데 얼마 동안 머물렀다. 그래서 나에게 답을 이끌어 줄 수있는 도움은 크게 감사 할 것이다.

답변

3

교회 인코딩은 논쟁에 대한 기능의 반복 된 적용으로 이해 될 수 있다는 것을 상기하십시오.

: 중복 괄호를 제거, 람다 형태

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 

: 그래서 우리는 그것을 적용 후 m 번 인수에 xm + n 번 함수 f을 적용하거나 동등하게 적용 n 시간 및 필요 m + n를 추가

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)) 
+0

함수를 사용한 예제는 실제로 통찰력이 있었고 람다 함수를 이해하는 데 많은 혼란을 겪었으며 매우 영리하다는 것을 알았습니다. 나는 사실 그것을 이해하기 위해 함수를 람다 (lambdas)로 번역하면서 놀려고합니다. 감사! – Andrew

관련 문제