자연수를 고차 함수로 표현
수학 에서 처치 인코딩 은 람다 미적분학에서 데이터와 연산자를 나타내는 수단입니다.교회 숫자는 람다 표기법을 사용한 자연수의 표현이다.이 방법은 람다 미적분의 데이터를 처음으로 이런 방식으로 인코딩한 Alonzo Church의 이름을 따서 명명되었습니다.
일반적으로 다른 표기법(정수, 부울란, 쌍, 목록 및 태그 부착 결합 등)에서 원시적인 것으로 간주되는 용어는 교회 인코딩에서 상위 함수에 매핑됩니다. Church-Turing 논문 은 계산 가능한 연산자(및 그 피연산자)는 Church 인코딩으로 [dubious – discuss ] 표현될 수 있다고 주장한다.비정형 람다 미적분학에서 유일한 원시 데이터 유형은 함수입니다.
사용하다 Church 인코딩을 직접 구현하면 O ( 1 )에서 O ( n ) ( n ) ( n \ displaystyle O ( n ) 로의 액세스 조작이 느려지고, 여기서 n \ displaystyle n은 데이터 구조의 크기이므로 Church 인코딩이 [1] 실용적이지 않습니다. 연구에 따르면 이는 표적 최적화를 통해 해결할 수 있지만, 대부분 의 기능적 프로그래밍 언어는 대신 중간 표현을 확장하여 대수적 데이터 유형을 [2] 포함합니다. 그럼에도 불구하고 Church 인코딩은 부분 평가와 정리 [1] 증명에 대한 자연스러운 표현이기 때문에 이론적인 논쟁에서 종종 사용된다. 상위 [3] 유형을 사용 하여 작업을 입력할 수 있으며 원시 재귀에 쉽게 액세스할 [1] 수 있습니다. 함수가 유일한 원시 데이터 유형이라는 가정은 많은 증거를 합리화합니다.
교회 인코딩은 완전하지만 대표적으로만 가능합니다. 표현을 일반 데이터 유형으로 변환하여 사람들에게 표시하기 위해서는 추가 기능이 필요합니다. 처치의 정리 에서 등가의 결정 불가능 으로 인해 두 함수가 확장적 으로 동일한지 결정하는 것은 일반적으로 가능하지 않다. 변환은 함수를 적용하여 함수가 나타내는 값을 가져오거나 해당 값을 리터럴 람다 용어로 검색할 수 있습니다. 람다 미적분은 보통 강약적 등식을 사용하는 것으로 해석됩니다. 평등에 대한 집중적 정의와 확장적 정의 간의 차이 때문에 결과의 해석에 잠재적 인 문제가 있다 .
교회 숫자 교회 숫자는 교회 부호화에서 자연수를 표현 한 것입니다. 자연수 n을 나타내는 고차 함수는 임의의 함수 f{displaystyle f} 를 n배 구성 에 매핑하는 함수입니다.간단히 말하면, 숫자의 "값"은 함수가 인수를 캡슐화한 횟수와 동일합니다.
f ∘ n = f ∘ f ∘ ⋯ ∘ f ⏟ n 시대 . {\displaystyle f^{\display n}=\underbrace {f\display f\cdots\cdots\cdots f}_{ndisplaytext{times}}}, 모든 교회 숫자는 두 가지 매개변수를 사용하는 함수입니다. 교회 숫자 0, 1 , 2 , ...는 람다 미적분학에서 다음과 같이 정의된다.
함수를 전혀 적용하지 않는 0 부터 시작 하여 1회 적용 , 2회 적용, 3회 적용 등 으로 진행 합니다.
번호 함수 정의 람다식 0 0 f x = x 0 = λ f . λ x . x 1 1 f x = f x 1 = λ f . λ x . f x 2 2 f x = f ( f x ) 2 = λ f . λ x . f ( f x ) 3 3 f x = f ( f ( f x ) ) 3 = λ f . λ x . f ( f ( f x ) ) ⋮ ⋮ ⋮ n n f x = f n x n = λ f . λ x . f ∘ n x {\displaystyle {begin {array} {r l} {\text {Number}} & {\text{ 함수 정의}}&{\text {Lambda expression}}\hline 0&0\f\x=0=\lambda f. \sysda x.x\1&1\f\x=f\x&1=\sysda f. \seconda x.f\x\2&2\f\x=f\(f\x)&2=\seconda f. \seconda x.f\(f\x)\3\f\x=f\(f\x)&3=\seconda f. \sqda x.f\(f\(f\x)\ \\vdots &\vdots &\vdots \\n&n\f\x=f^{n}\x&n=\contextda f. \sysda x.f^{\sysn}\x\end{array}} 교회 숫자 3은 주어진 함수를 한 값에 세 번 적용하는 동작을 나타냅니다. 제공된 함수는 먼저 제공된 파라미터에 적용된 후 자체 결과에 순차적으로 적용됩니다. 최종 결과는 숫자 3이 아닙니다(지정된 파라미터가 0이고 함수가 후계 함수인 경우를 제외). 최종 결과가 아니라 함수 자체가 교회 숫자 3이다. Church number 3은 단순히 어떤 것이든 세 번 한다는 것을 의미한다. 그것은 "세 번"이 의미하는 바를 과시하는 것 이다.
교회 숫자를 사용한 계산 숫자 에 대한 산술 연산은 교회 숫자에 대한 함수로 나타낼 수 있다.이러한 함수는 람다 미적분으로 정의하거나 대부분의 함수 프로그래밍 언어로 구현할 수 있습니다(람다 식을 함수로 변환 참조 ).
더하기 함수 ( ( m , n ) = m + n ( \ displaystyle \operatorname { plus } ( m , n ) = m + n } ( x ) = f ( m ( f ( n ){ display f^ { \ display style f + n } ( x ) = f ^ { f } { f + n } { f + n } { f } { f } { f } { f } { f } { f } n }
플러스 ≡ λ m . λ n . λ f . λ x . m f ( n f x ) \displaystyle \operatorname {plus} \equiv \displayda m. \420da n \contextda f. \sqda x.m\f\(n\f\x)} 후속 함수 succ ( ( n ) = n + 1 { displaystyle \operatorname { } ( n ) = n+1 } 은 ( + 1 1 ){ displaystyle ( \operatorname {plus} \ 1)} 와 β등가 됩니다.
성공하다 ≡ λ n . λ f . λ x . f ( n f x ) \displaystyle \operatorname {display} \equiv \displayda n. \contextda f. \sqda x.f\(n\f\x)} 곱셈 함수 mult ( ( m , n ) = m n n { displaystyle \operatorname { mult } ( m , n ) = m * n ( x n n ) ) m ( x ) { displaystyle f^{ \ displaystyle f^{ n } ( m*n) = f * n } ) \ n \ \ \ n ∘ ∘ \ \ \ \ n \ \ \ \ \ \ ∘ ∘ ∘ ∘ \ \ \ \
멀티 ≡ λ m . λ n . λ f . λ x . m ( n f ) x \displaystyle \operatorname {mult} \equiv \displayda m. \420da n \contextda f. \sqda x.m\(n\f)\x} 지수함수 exp display ( m , n ) = m n \ displaystyle \operatorname { exp } ( m , n ) → m^ { n } 은 교회 숫자의 정의 에 의해 지정 됩니다.정의 대체 m → m → h ^{n } \ x } . ,ystyle n\m\f=m^{n}\f} 및 ,
exp m n = m n = n m \displaystyle \operatorname {exp} \m\n=m^{n}=n\m} 람다 표정을 짓는데
exp ≡ λ m . λ n . n m \displaystyle \operatorname {exp} \equiv \displayda m. \sysda n.n\m} pred ( ( n ) { displaystyle \operatorname { pred } ( n ) 함수는 이해 하기 어렵습니다.
프리드 ≡ λ n . λ f . λ x . n ( λ g . λ h . h ( g f ) ) ( λ u . x ) ( λ u . u ) \displaystyle \operatorname {display} \equiv \displayda n. \contextda f. \contextda x.n\ (\contextda g). \subda h.h\(g\f)\(\subda u.x)\(\subda u.u)} 교회 숫자는 함수 를 n회 적용합니다. 이전 함수는 매개 변수를 n - 1회 적용하는 함수를 반환해야 합니다. 이것은 f와 x 주위 에 컨테이너를 구축함으로써 달성되며, f와 x는 함수의 적용을 최초로 생략하는 방식으로 초기화됩니다. 자세한 설명은 이전 문서를 참조 하십시오.
감산 함수는 이전 함수를 기반으로 작성할 수 있습니다.
마이너스 ≡ λ m . λ n . ( n 프리드 ) m \displaystyle \operatorname {display} \equiv \displayda m. \sysda n. (n\operatorname {syslog})\m} 교회 숫자 함수표 * Church 인코딩에서는
프리드 ( 0 ) = 0 {\displaystyle\operatorname{display}(0)=0} m <=> n → m − n = 0 {\displaystyle m<=n\to m-n=0} 이전 함수의 도출 Church 인코딩에 사용된 이전 함수는 다음과 같습니다.
pred ( n ) = { 0 、 n - 1 、 { displaystyle \operatorname { parames } ( n ) = cases } 0 & { \ mbox { cases } n = 0 , \ n - 1 & { \ mbox { cases } } } 이전 버전을 구축하려면 기능을 1시간 단축하는 방법이 필요합니다. 숫자 n은 함수 를 x 에 fn회 적용한다.이전 함수는 숫자 n을 사용하여 함수를 n-1번 적용해야 합니다.
이전 함수를 구현하기 전에 컨테이너 함수로 값을 정리하는 스킴을 다음에 나타냅니다. f 와 x 대신 inc 와 init이라고 하는 새로운 함수를 정의합니다.컨테이너 함수를 값이라고 합니다 . 표의 왼쪽에는 inc 와 init에 적용 되는 숫자n 이 표시되어 있습니다.
번호 init 사용 const 사용 0 초기화 = 가치 x 1 주식회사 초기화 = 가치 ( f x ) 주식회사 컨스턴트 = 가치 x 2 주식회사 ( 주식회사 초기화 ) = 가치 ( f ( f x ) ) 주식회사 ( 주식회사 컨스턴트 ) = 가치 ( f x ) 3 주식회사 ( 주식회사 ( 주식회사 초기화 ) ) = 가치 ( f ( f ( f x ) ) ) 주식회사 ( 주식회사 ( 주식회사 컨스턴트 ) ) = 가치 ( f ( f x ) ) ⋮ ⋮ ⋮ n n 주식회사 초기화 = 가치 ( f n x ) = 가치 ( n f x ) n 주식회사 컨스턴트 = 가치 ( f n − 1 x ) = 가치 ( ( n − 1 ) f x ) {\displaystyle{\begin{배열}{rrr}{\text{번호}}&{\text{init를 사용하여}}&{\text{const를 사용하여}}\\\hline 0&,\operatorname{init}=\operatorname{값})x&, \\1&,\operatorname{inc})\operatorname{init}=\operatorname{값})(f\))&,\operatorname{inc})\operatorname{const}=\operatorname{값})x\\2&, \operatorname{inc.}년(\operatorname{inc})) operatorname {init} =\operatorname {value} \(f\(f\x)) &\operatorname {inc} \ (\operatorname {inc} \ operatorname {const} )=\operatorname {value} \ (f\x)\3&\operatorname {inc} \ (\operatorname {init} )= \operatorname {value} \ f} &\operatorname {inc} \ (\operatorname {inc} \ (\operatorname {inc} \ \ \operatorname {const} )=\operatorname {value} \ (f\x)\ \\vdots &\vdots &\vdots \\n&n\operatorname {inc} \\operatorname {init} =\operatorname {value} \ (f^{n}\x)=\operatorname {inc} \operatorname {inc} \operatorname {inc} 일반적인 반복 규칙은 다음과 같습니다.
주식회사 ( 가치 v ) = 가치 ( f v ) {\displaystyle \operatorname {inc} \ (\operatorname {value} \ v)=\operatorname {value} \ (f\ v)} 컨테이너에서 값을 검색하는 기능도 있는 경우(추출 이라고 함),
압축풀기 ( 가치 v ) = v {\displaystyle \operatorname {value} \ (\operatorname {value} \ v)=v} 그런 다음 추출물을 사용하여 다음 과 같이 새넘 함수를 정의할 수 있습니다.
서멀넘 = λ n . λ f . λ x . 압축풀기 ( n 주식회사 초기화 ) = λ n . λ f . λ x . 압축풀기 ( 가치 ( n f x ) ) = λ n . λ f . λ x . n f x = λ n . n \displaystyle \operatorname {samenum} =\displayda n. \contextda f. \capda x.\operatorname {cap} \ (n\operatorname {inc} \operatorname {init} )=\capda n. \contextda f. \operatorname {value} \ (\operatorname {value} \ (n\f\x)) =\120da n. \contextda f. \sysda x.n\f\x=\sysda n.n} samenum 함수는 본질적으로 유용하지 않습니다.단, inc는 f 의 호출을 container 인수에 위임 하므로 첫 번째 어플리케이션에서 f의 첫 번째 어플리케이션을 건너뛸 수 있는 인수를 무시하는 특별한 컨테이너를 받을 수 있습니다. 이 새로운 초기 컨테이너 를 const라고 부릅니다. 위 표의 오른쪽은 n inc const의 확장 을 나타냅니다. 그런 다음 같은 함수의 식에서 init을 const 로 대체 하면 이전 함수를 얻을 수 있습니다.
프리드 = λ n . λ f . λ x . 압축풀기 ( n 주식회사 컨스턴트 ) = λ n . λ f . λ x . 압축풀기 ( 가치 ( ( n − 1 ) f x ) ) = λ n . λ f . λ x . ( n − 1 ) f x = λ n . ( n − 1 ) {\displaystyle\operatorname{display}=\displayda n. \contextda f. \capda x.\operatorname {const} \ (n\operatorname {inc} \operatorname {const} )=\capda n. \contextda f. \operatorname {value} \ (\operatorname {value} \ ( (n-1)\ f\ x ) =\120da n. \contextda f. \sysda x.(n-1)\f\x=\sysda n.(n-1)} 아래 에 설명된 바 와 같이 inc , init, const , value 및 extract 함수는 다음과 같이 정의할 수 있다.
가치 = λ v . ( λ h . h v ) 압축풀기 k = k λ u . u 주식회사 = λ g . λ h . h ( g f ) 초기화 = λ h . h x 컨스턴트 = λ u . x {\displaystyle {displaystyle}\operatorname {value}&=\operatorname {nc} k&=k\operatorname {inc} &=\operatorname {inc} &=g. \sysda h.h\(g\f)\\operatorname {init} &=\sysda h.h\x\\operatorname {const} &=\sysda u.x\end{aligned}} 그래서 람다 표현은 다음 과 같이 나타납니다.
프리드 = λ n . λ f . λ x . n ( λ g . λ h . h ( g f ) ) ( λ u . x ) ( λ u . u ) {\displaystyle\operatorname{display}=\displayda n. \contextda f. \contextda x.n\ (\contextda g). \subda h.h\(g\f)\(\subda u.x)\(\subda u.u)} 값 컨테이너 값 컨테이너는 해당 값에 함수를 적용합니다. 이것은 다음과 같이 정의됩니다.
가치 v h = h v \displaystyle \operatorname {value} \v\h=h\v} 그렇게,
가치 = λ v . ( λ h . h v ) \displaystyle \operatorname {value} = \displayda v. (\displayda h.h\v)} 주식회사 inc 함수는 v를 포함 하는 값을 가져와서 f v를 포함 하는 새 값을 반환해야 합니다.
주식회사 ( 가치 v ) = 가치 ( f v ) {\displaystyle \operatorname {inc} \ (\operatorname {value} \ v)=\operatorname {value} \ (f\ v)} g를 값 컨테이너로 하면
g = 가치 v {\displaystyle g=\operatorname {value} \v} 그리고나서,
g f = 가치 v f = f v {\displaystyle g\f=\operatorname {value} \v\f=f\v} 그렇게,
주식회사 g = 가치 ( g f ) {\displaystyle \operatorname {inc} \g=\operatorname {value} \ (g\f)} 주식회사 = λ g . λ h . h ( g f ) \displaystyle \operatorname {inc} =\displayda g. \sqda h.h\(g\f)} 값은 항등함수를 적용하여 추출할 수 있다.
I = λ u . u (\displaystyle I=\lambda u.u) I를 사용하여
가치 v I = v \displaystyle \operatorname {value} \v\I=v} 그렇게,
압축풀기 k = k I {\displaystyle\operatorname{display}\k=k\I} 계속 사전 에 구현 하기 위해 init 함수는 f를 적용 하지 않는 Const 로 대체됩니다.만족시킬 수 있는 경찰이 필요해
주식회사 컨스턴트 = 가치 x {\displaystyle \operatorname {inc} \operatorname {const} =\operatorname {value} \x} λ h . h ( 컨스턴트 f ) = λ h . h x \displaystyle \displayda h.h\(\operatorname {const} \f)=\displayda h.h\x} 만족스러운 것은 만족합니다.
컨스턴트 f = x {\displaystyle\operatorname{const}\f=x} 람다 표현으로 말하면
컨스턴트 = λ u . x \displaystyle \operatorname {const} =\displayda u.x}
pred를 정의하는 또 다른 방법 Pred는 쌍을 사용하여 정의할 수도 있습니다.
f = λ p . 짝 ( 둘째 p ) ( 성공하다 ( 둘째 p ) ) 영 = ( λ f . λ x . x ) pc0 = 짝 영 영 프리드 = λ n . 첫번째 ( n f pc0 ) {\displaystyle {displaystyle {aligned}\operatorname {f} = &\\\operatorname {second} \(\operatorname {second} \)\ (\operatorname {second} \ p) \\\operatorname {zero} =\ (\operatorname f). \pcda x.\x)\\operatorname {pc0} =&\operatorname {pc0} \\operatorname {zero} \operatorname {zero} \\operatorname {first} \\operatorname {f} \pcorname {f} \operatorname {f} 이는 보다 단순한 정의이지만 pread에 대한 보다 복잡한 표현으로 이어집니다. § 3 이전 \displaystyle \operatorname {pred} \operatorname {three } 확장 :
프리드 세개 = 첫번째 ( f ( f ( f ( 짝 영 영 ) ) ) ) = 첫번째 ( f ( f ( 짝 영 하나. ) ) ) = 첫번째 ( f ( 짝 하나. 두명 ) ) = 첫번째 ( 짝 두명 세개 ) = 두명 (\displaystyle {displaystyle {aligned} \operatorname {three} = &\\operatorname {f} \ (\operatorname {f} \ (\operatorname {f} \ (\operatorname {f} \ (\operatorname {f} \zeratorname {zero} \ } \operatorname {zeratorname {zername} ) {zername {zeratorname} ) {zeratorname {zero}) {zername {zername} ) {zero} 0 \=&\operatorname {first} \ (\operatorname {f} \ (\operatorname {f} \ \\operatorname {zero} \ \\operatorname {one} )) \=&\operatorname {first} \ (\operatorname {f} \ (\operatorname {f} \ (\operatorname {one} \\operatorname {first} \ (\operatorname {first} \ ) \ = \ operatorname {f} \ = 3 ) 나누기 자연수 의 나눗셈은 다음과 같이 [5] 실시할 수 있다.
n / m = 한다면 n ≥ m 그리고나서 1 + ( n − m ) / m 또 다른 0 {\displaystyle n/m=\operatorname {if}\n\geq m\\operatorname {then}\1+(n-m)/m\\operatorname {display}\0} n - m ( displaystyle n - m )계산 에는 많은 베타삭감이 필요합니다. 손으로 줄이지 않는 한, 이것은 그다지 중요하지 않지만, 이 계산을 두 번 하지 않는 것이 좋습니다. 숫자를 테스트하기 위한 가장 간단한 술어 는 IsZero이므로 조건을 고려하십시오.
Is Zero ( 마이너스 n m ) (\displaystyle \operatorname {IsZero} \ (\operatorname {minus} \n\m)} But this condition is equivalent to n ≤ m {\displaystyle n\leq m} , not n < m {\displaystyle n<m} . If this expression is used then the mathematical definition of division given above is translated into function on Church numerals as,
나누기 1 n m f x = ( λ d . Is Zero d ( 0 f x ) ( f ( 나누기 1 d m f x ) ) ) ( 마이너스 n m ) \displaystyle \operatorname {sn\m\f=(\displayda d). \operatorname {IsZero} \ d\ (0\ f\ x)\ (f\ (\operatorname {divide1} \ d\ m\ f\ x)\ (\operatorname {minus} \ n\ m)} 필요에 따라 이 정의에는 마이너스n m(\displaystyle \operatorname {minus}\n\m ) 에 대한 단일 콜이 있습니다.단, 이 수식은 (n - 1 ) / m {\displaystyle (n-1)/m } 의 값을 나타냅니다.
이 문제는 divide를 호출 하기 전에1 ~ n 을 추가하는 것으로 해결할 수 있습니다. 나눗셈의 정의 는 다음과 같습니다.
나누다 n = 나누기 1 ( 성공하다 n ) {\displaystyle \operatorname {displaystyle} \n=\operatorname {display1} \(\operatorname {display} \n)} divide1 은 재귀적 정의입니다.Y combinator 는 재귀 구현에 사용할 수 있습니다.div by라는 새로운 함수를 만듭니다.
왼쪽에서 div1 → div c c \ displaystyle \operatorname { div1} \ rightarrow \operatorname {div} \ c } 오른쪽 분할 1 → c {displaystyle \operatorname {param1} \오른쪽 화살표 c} 갖기 위해,
나누다 = λ c . λ n . λ m . λ f . λ x . ( λ d . Is Zero d ( 0 f x ) ( f ( c d m f x ) ) ) ( 마이너스 n m ) \displaystyle \operatorname {div} =\displayda c.\displayda n. \420da m. \contextda f. \sqda x. (\sqda d). \operatorname {IsZero} \ d\ (0\ f\ x)\ (f\ (c\ d\ m\ f\ x)\ (\operatorname {minus} \ n\ m)} 그리고나서,
나누다 = λ n . 나누기 1 ( 성공하다 n ) {\displaystyle\operatorname{display}=\displayda n. \operatorname {param1} \(\operatorname {param} \n)} 어디에,
나누기 1 = Y 나누다 성공하다 = λ n . λ f . λ x . f ( n f x ) Y = λ f . ( λ x . f ( x x ) ) ( λ x . f ( x x ) ) 0 = λ f . λ x . x Is Zero = λ n . n ( λ x . 거짓의 ) 진실의 {{displaystyle}\operatorname {div}\operatorname {div}\operatorname {div}\\operatorname {div}\=\operatorname n. \contextda f. \sqda x.f\(n\f\x)\\ Y&=\lambda f.(\lambda x.f\(x\x)\(\lambda x.f\(x\x))) \\0&=\contextda f. \operatorname {IsZero} &=\operatorname {false}\\operatorname {true} \end{aligned}} 진실의 ≡ λ a . λ b . a 거짓의 ≡ λ a . λ b . b displaystyle(디스플레이 스타일) & operatorname {true} & equiv \ a aa.a. \capda b.a\\operatorname {false} &\equiv \capda a. \sysda b.b\end {aligned}} 마이너스 = λ m . λ n . n 프리드 m 프리드 = λ n . λ f . λ x . n ( λ g . λ h . h ( g f ) ) ( λ u . x ) ( λ u . u ) "displaystyle""연산자 이름"="a m. \sysda n.n\operatorname {syslog} m\\operatorname {syslog} &=\syslogda n. \contextda f. \contextda x.n\ (\contextda g). \subda h.h\(g\f)\(\subda u.x)\(\subda u.u)\end {aligned}} 주다,
나누다 = λ n . ( ( λ f . ( λ x . x x ) ( λ x . f ( x x ) ) ) ( λ c . λ n . λ m . λ f . λ x . ( λ d . ( λ n . n ( λ x . ( λ a . λ b . b ) ) ( λ a . λ b . a ) ) d ( ( λ f . λ x . x ) f x ) ( f ( c d m f x ) ) ) ( ( λ m . λ n . n ( λ n . λ f . λ x . n ( λ g . λ h . h ( g f ) ) ( λ u . x ) ( λ u . u ) ) m ) n m ) ) ) ( ( λ n . λ f . λ x . f ( n f x ) ) n ) \displaystyle \operatorname {displayda} = \displayda n. (\displayda f.\displayda x.x\x)\ (\displayda x.f\x\displayda n). \420da m. \contextda f. \nambda x.(\nambda n.n\)(\nambda x.(\nambda a). \seconda b.b)\(\seconda a). \seconda b.a)\ d\ (\seconda f). \c4da x.x)\f\x(f\(c\d\m\f\x)\(\c4da m). \sysda n.n(\sysda n). \contextda f. \contextda x.n\ (\contextda g). \capda h.h\(g\f)\(\capda u.x)\(\capda u.u)m)\(\capda n). \contextda f. \sqda x.f\(n\f\x)\n)} 또는 텍스트로서 ,에 \를 사용하고,
나눗셈 = (\n.(\f.\x.x x)(\x.f(x x))(\c.\n.\m.\f). \x.(\n.n(\x.\b.b)(\a.\b.a) d(\f.\x.x) f x)(f(c d m f x))(\m.n(\n.\f). \x.n (\g) \h.h(g f)(\u.x)(\u.u) m) (\n.\f). \x. f (n f x) n) 예를 들어 9/3은 다음과 같이 표시됩니다.
분할(\f) \x.f (f (f (f (f (f (f (f (f (f x)))))))) (\f). \x.f(f(f x)) 람다 미적분 계산기를 사용하면 위의 식은 정규 순서를 사용하여 3으로 감소합니다.
\f.\x.f(f(x)) 서명된 번호 교회 숫자를 서명 된 숫자로 확장 하는 간단한 방법 중 하나는 교회 쌍을 사용하는 것입니다. 교회 숫자는 양의 값과 음의 [6] 값을 나타냅니다. 정수값은 두 교회 숫자의 차이입니다.
자연수는 부호 있는 숫자로 변환됩니다.
개종시키다 s = λ x . 짝 x 0 \displaystyle \operatorname {display} _{s}=\displayda x.\operatorname {display} \x\0} 부정은 값을 교환함으로써 실행됩니다.
부정하다 s = λ x . 짝 ( 둘째 x ) ( 첫번째 x ) {\displaystyle \operatorname {neg}=\displayda x.\operatorname {second} \x} \(\operatorname {first} \x)\(\operatorname {first} \x)} 쌍 중 하나가 0일 경우 정수 값이 더 자연스럽게 표시됩니다. OneZero 함수는 이 조건을 충족합니다.
원제로 = λ x . Is Zero ( 첫번째 x ) x ( Is Zero ( 둘째 x ) x ( 원제로 짝 ( 프리드 ( 첫번째 x ) ) ( 프리드 ( 둘째 x ) ) ) ) \displaystyle \operatorname {OneZero} = \operatorname {IsZero} \ (\operatorname {second} \x) \ x \ (\operatorname {Zero} \operatorname {Zero} \ ) \ ( \operatorname {Zername {Zero} \ ) \ ) 재귀는 Y combinator를 사용하여 구현할 수 있습니다.
OneZ = λ c . λ x . Is Zero ( 첫번째 x ) x ( Is Zero ( 둘째 x ) x ( c 짝 ( 프리드 ( 첫번째 x ) ) ( 프리드 ( 둘째 x ) ) ) ) \displaystyle \operatorname {OneZ} =\operatorname {IsZero} \ (\operatorname {isZero} \ (\operatorname {second} \x) \ (\operatorname { sero} \\ ) \ operatorname {\\\ opername {iszername} \ ) 원제로 = Y OneZ {\displaystyle\operatorname{OneZero}=Y\operatorname{OneZ}} 플러스 마이너스 덧셈은 수학적으로 쌍으로 정의된다.
x + y = [ x p , x n ] + [ y p , y n ] = x p − x n + y p − y n = ( x p + y p ) − ( x n + y n ) = [ x p + y p , x n + y n ] \displaystyle x+y=[x_{p},x_{n}+[y_{n}]=x_{p}-x_{n}+y_{p}=(x_{p}+y_{p}-(x_n}+y_{n})-(x_n}+y_n}) =[x_{p}+y_{p},x_{n}+y_{n}} 마지막 표현은 람다 미적분으로 번역된다.
플러스 s = λ x . λ y . 원제로 ( 짝 ( 플러스 ( 첫번째 x ) ( 첫번째 y ) ) ( 플러스 ( 둘째 x ) ( 둘째 y ) ) ) \displaystyle \operatorname {plus} _{s}=\displayda x.\displayda y. \operatorname {OneZero} \ (\operatorname {pair} \ (\operatorname {first} \x) \ (\operatorname {first} \ y) \ (\operatorname {plus} \ (\operatorname {second} \) \ ) \ (\operatorname {first} \x) \ ) 마찬가지로 뺄셈도 정의되어 있다.
x − y = [ x p , x n ] − [ y p , y n ] = x p − x n − y p + y n = ( x p + y n ) − ( x n + y p ) = [ x p + y n , x n + y p ] \displaystyle x-y=[x_{p},x_{n}-[y_{p}-x_{n}-y_{p}+y_{n}=(x_{p}+y_{n}-(x_{p}+y_{n})-(x_n}+y_{p}) =[x_{p}+y_{n},x_{n}+y_{p}} 부여,
마이너스 s = λ x . λ y . 원제로 ( 짝 ( 플러스 ( 첫번째 x ) ( 둘째 y ) ) ( 플러스 ( 둘째 x ) ( 첫번째 y ) ) ) {\displaystyle\operatorname{s}=\displayda x.\displayda y. \operatorname {OneZero} \ (\operatorname {pair} \ (\operatorname {first} \x) \ (\operatorname {second} \ y) \ (\operatorname {plus} \ (\operatorname {second} \) \ ) \ (\operatorname {first y ) \ ) ) 곱셈과 나눗셈 곱셈은 다음과 같이 정의할 수 있다.
x ∗ y = [ x p , x n ] ∗ [ y p , y n ] = ( x p − x n ) ∗ ( y p − y n ) = ( x p ∗ y p + x n ∗ y n ) − ( x p ∗ y n + x n ∗ y p ) = [ x p ∗ y p + x n ∗ y n , x p ∗ y n + x n ∗ y p ] \displaystyle x*y=[x_{p},x_{n}*[y_{p}-x_{n}*(y_{p}-y_{n})=(x_{p}*y_{p}+x_{n}) }*y_{n}-(x_{p}*y_{n}+x_{n}) }*y_{p} =[x_{p}*y_{p}+x_{n] }*y_{n},x_{p}*y_{n}+x_{n} }*y_{p}} 마지막 표현은 람다 미적분으로 번역된다.
멀티 s = λ x . λ y . 짝 ( 플러스 ( 멀티 ( 첫번째 x ) ( 첫번째 y ) ) ( 멀티 ( 둘째 x ) ( 둘째 y ) ) ) ( 플러스 ( 멀티 ( 첫번째 x ) ( 둘째 y ) ) ( 멀티 ( 둘째 x ) ( 첫번째 y ) ) ) \displaystyle \operatorname {mult}_{s}=\displayda x.\displayda y. \operatorname {second} \ (\operatorname {plus} \ (\operatorname {first} \x) \ (\operatorname {first} \x) \ (\operatorname {mult} \ (\operatorname {second} \x) \ (\operatorname {second y} \operatorname {first} \operatorname {first} \x} \ ) \ ) ) operatorname {second} \ x)\ (\operatorname {first} \ y)} 나눗셈에 대해서도 같은 정의가 여기에 제시되어 있습니다.단, 이 정의에서는 각 쌍에 1개의 값이 0이어야 합니다(위의 OneZero 참조 ). divZ 함수를 사용하면 성분이 0인 값을 무시할 수 있습니다.
분할하다 = λ x . λ y . Is Zero y 0 ( 나누다 x y ) \displaystyle \operatorname {divZ} = \displayda x.\displayda y. \operatorname {IsZero} \ y\ 0\ (\operatorname {divide} \ x\ y)} 그 후 divZ는 곱셈과 동일하지만 다중이 divZ 로 대체 되는 공식으로 사용됩니다.
나누다 s = λ x . λ y . 짝 ( 플러스 ( 분할하다 ( 첫번째 x ) ( 첫번째 y ) ) ( 분할하다 ( 둘째 x ) ( 둘째 y ) ) ) ( 플러스 ( 분할하다 ( 첫번째 x ) ( 둘째 y ) ) ( 분할하다 ( 둘째 x ) ( 첫번째 y ) ) ) {\displaystyle\operatorname{s}=\displayda x.\displayda y. \operatorname {pair} \ (\operatorname {plus} \ (\operatorname {first} \x) \ (\operatorname {first} \ y) \ (\operatorname {divZ} \ (\operatorname {second} x) \ (\operatorname {first} \x} \) operatorname {second} \ x)\ (\operatorname {first} \ y)} 유리수와 실수수 합리적 이고 계산 가능한 실수는 람다 미적분에도 부호화될 수 있다.유리번호는 부호화된 번호의 쌍으로 부호화할 수 있습니다. 계산 가능한 실수는 실제 값과의 차이가 [7] 필요한 만큼 작게 만들어질 수 있는 수만큼 차이가 나는 것을 보장하는 제한 프로세스에 의해 부호화될 수 있습니다. [8] 주어진 참조는 이론적으로 람다 미적분으로 번역될 수 있는 소프트웨어를 기술한다.실수가 정의되면 복소수는 자연스럽게 실수의 쌍으로 부호화됩니다.
위에서 설명한 데이터 유형 및 함수는 모든 데이터 유형 또는 계산이 람다 미적분으로 인코딩될 수 있음을 보여줍니다. 이것은 처치튜링 논문입니다.
다른 표현과의 번역 대부분의 현실 언어들은 기계 원어민 정수를 지원합니다; 교회 와 비구치 함수는 음이 아닌 정수와 대응하는 교회 숫자 사이를 변환합니다. 함수는 여기 해스켈 에서 제공되고 있습니다. \
람다 미적분의 of에 해당한다. 다른 언어에서도 구현은 비슷합니다.
유형 교회 a = ( a -> a ) -> a -> a 교회 :: 정수 -> 교회 정수 교회 0 = \ f -> \ x -> x 교회 n = \ f -> \ x -> f ( 교회 ( n - 1 ) f x ) 언어치 :: 교회 정수 -> 정수 언어치 cn = cn ( + 1 ) 0
처치 부울런스 Church Boalans는 True 및 False 부울 값의 Church 인코딩입니다.일부 프로그래밍 언어에서는 Smalltalk와 Pico 와 같은 부울 산술의 구현 모델로 사용합니다.
부울 로직은 선택사항으로 간주할 수 있습니다. Church 인코딩 (true 및 false )은 다음 두 가지 파라미터의 함수입니다.
true 는 첫 번째 파라미터를 선택합니다. false 는 두 번째 파라미터를 선택합니다. 두 가지 정의는 Church Bohans로 알려져 있습니다.
진실의 ≡ λ a . λ b . a 거짓의 ≡ λ a . λ b . b displaystyle(디스플레이 스타일) & operatorname {true} & equiv \ a aa.a. \capda b.a\\operatorname {false} &\equiv \capda a. \sysda b.b\end {aligned}} 이 정의를 통해 술어(즉 , 논리값을 반환 하는 함수)가 if-clauses로 직접 작용할 수 있다. 부울을 반환하는 함수는 두 개의 파라미터에 적용되며 첫 번째 파라미터 또는 두 번째 파라미터 중 하나를 반환합니다.
p r e d i c a t e - x t h e n - c l a u s e e l s e - c l a u s e {\displaystyle \operatorname {cisco-} x\\operatorname {then-display} \\operatorname {complete} fredicate-x 가 true 로 평가되면 then-fredicate 로 평가되며, false 로 평가 되면 else-fredicate-x가 평가됩니다.
true 와 false는 첫 번째 또는 두 번째 파라미터를 선택하기 때문 에 논리연산자를 제공하기 위해 조합할 수 있습니다.의 구현에는 여러 가지가 있습니다.
그리고. = λ p . λ q . p q p 또는 = λ p . λ q . p p q 것은 아니다. 1 = λ p . λ a . λ b . p b a 것은 아니다. 2 = λ p . p ( λ a . λ b . b ) ( λ a . λ b . a ) = λ p . p 거짓의 진실의 xor = λ a . λ b . a ( 것은 아니다. b ) b 한다면 = λ p . λ a . λ b . p a b &#displaystyle &#operatorname &=&#da p. \sysda q.p\p\\operatorname {or} &=\sysda p. \sysda q.p\q\\operatorname {not} _{1}&=\sysda p. \420da a. \sysda b.p\a\\operatorname {not}_{2}&=\sysda p.p\(\sysda a). \seconda b.b)\(\seconda a). \sysda b.a)=\sysda p.p\operatorname {false}\operatorname {true}\\operatorname {xor} &=\sysda a. \paramda b.a\(\operatorname {not} \b)\b\\operatorname {if} &=\paramda p. \420da a. \sysda b.p\a\b\end{aligned}} 몇 가지 예:
그리고. 진실의 거짓의 = ( λ p . λ q . p q p ) 진실의 거짓의 = 진실의 거짓의 진실의 = ( λ a . λ b . a ) 거짓의 진실의 = 거짓의 또는 진실의 거짓의 = ( λ p . λ q . p p q ) ( λ a . λ b . a ) ( λ a . λ b . b ) = ( λ a . λ b . a ) ( λ a . λ b . a ) ( λ a . λ b . b ) = ( λ a . λ b . a ) = 진실의 것은 아니다. 1 진실의 = ( λ p . λ a . λ b . p b a ) ( λ a . λ b . a ) = λ a . λ b . ( λ a . λ b . a ) b a = λ a . λ b . ( λ c . b ) a = λ a . λ b . b = 거짓의 것은 아니다. 2 진실의 = ( λ p . p ( λ a . λ b . b ) ( λ a . λ b . a ) ) ( λ a . λ b . a ) = ( λ a . λ b . a ) ( λ a . λ b . b ) ( λ a . λ b . a ) = ( λ b . ( λ a . λ b . b ) ) ( λ a . λ b . a ) = λ a . λ b . b = 거짓의 \displaystyle\operatorname{및}\operatorname{true}\operatorname{false}&=(\displayda p). \operatorname {true} \operatorname {false} =\operatorname {true} \operatorname {false} \operatorname {true} =(\operatorname a). \operatorname {false} \operatorname {true} = \operatorname {false} \\operatorname {or} \operatorname {true} \operatorname {false} &=(\operatorname p). \subda q.p\q)\ (\subda a). \seconda b.a)\(\seconda a). \sysda b.b)=(\sysda a). \seconda b.a)\(\seconda a). \seconda b.a)\(\seconda a). \sysda b.b)=(\sysda a). \sysda b.a)=\operatorname {true} \\operatorname {not} _{1}\\operatorname {true} &=(\sysda p). \420da a. \seconda b.p\b\a) (\seconda a). \sysda b.a)=\sysda a. \sqda b. (\cqda a). \subda b.a)\b\a=\subda a. \sysda b.(\sysda c.b)\a=\sysda a. \sysda b.b=\operatorname {false} \\operatorname {not} _{2}\\operatorname {true} &=(\sysda p.p\(\sysda a). \seconda b.b) (\seconda a). \subda b.a)(\subda a). \sysda b.a)=(\sysda a). \seconda b.a) (\seconda a). \seconda b.b) (\seconda a). \sysda b.a)=(\sysda b.(\sysda a). \seconda b.b)\(\seconda a). \sysda b.a)=\sysda a. \sysda b.b=\operatorname {false} \end{aligned}} 술어 술어 는 부울 값을 반환하는 함수입니다.가장 기본적인 술어는 IsZero(\displaystyle \operatorname {IsZero }) 입니다.인수가 Church number 0(\displaystyle 0) 인 경우 true(\ displaystyle \operatorname {true}), 인수 가 다른 교회 숫자인 경우 false(\displaystyle \operatorname {false}) 를 반환합니다 .
Is Zero = λ n . n ( λ x . 거짓의 ) 진실의 \displaystyle \operatorname {IsZero} = \displayda n.n\ (\displayda x.\operatorname {false})\\operatorname {true} 다음 술어는 첫 번째 인수가 두 번째 인수보다 작거나 같은지 여부를 테스트합니다.
LEQ = "m ." "n ." IsZero " ( - "mn ") {\display \operatorname {LEQ} =\displayda m. \420da n \operatorname {IsZero} \ (\operatorname {minus} \ m\ n ) , 정체성 때문에
x = y ≡ ( x ≤ y ∧ y ≤ x ) {\displaystyle x=y\equiv(x\leq y\land y\leq x)} 동등성을 위한 테스트는 다음과 같이 구현될 수 있다.
EQ = λ m . λ n . 그리고. ( LEQ m n ) ( LEQ n m ) \displaystyle \operatorname {EQ} =\displayda m. \420da n \operatorname {and} \(\operatorname {LEQ} \m\n)\(\operatorname {LEQ} \n\m)}
교회 쌍 교회 쌍은 쌍(2 태플) 유형의 교회 인코딩입니다. 쌍은 함수 인수를 사용하는 함수로 표시됩니다. 인수를 지정하면 인수를 쌍의 두 구성 요소에 적용합니다. 람다 미적분학의 정의는,
짝 ≡ λ x . λ y . λ z . z x y 첫번째 ≡ λ p . p ( λ x . λ y . x ) 둘째 ≡ λ p . p ( λ x . λ y . y ) "displaystyle "&quiv "\displaystyle "\displaystyle "\operatorname {displayda x.\ \capda z.z\x\y\operatorname {first} &\equiv \capda p.p\(\capda x.\capda y.x)\\\exquiv \capda p.p\(\capda y.y)\endaligned}. 예를들면,
첫번째 ( 짝 a b ) = ( λ p . p ( λ x . λ y . x ) ) ( ( λ x . λ y . λ z . z x y ) a b ) = ( λ p . p ( λ x . λ y . x ) ) ( λ z . z a b ) = ( λ z . z a b ) ( λ x . λ y . x ) = ( λ x . λ y . x ) a b = a \displaystyle {displaystyle}&\operatorname {first}(\operatorname {display} \a\b)\=&(\displayda x.\displayda y.x)\(\displayda x.\da y.x). \subda z.z\x\b)\=&(\subda x.\subda y.x)\(\subda z.z\a\b)\=&(\subda z.z\a\b)\(\subda x.x)\&(\subda x.x)\subda.x). 리스트 인코딩 (불변 ) 리스트 는 리스트노드로 구성됩니다. 목록의 기본 조작은 다음과 같습니다.
기능. 묘사 제로 빈 목록을 만듭니다. 하지 않다 목록이 비어 있는지 테스트합니다. 단점 지정된 값을 (공백일 가능성이 있음) 목록에 추가합니다. 머리 목록의 첫 번째 요소를 가져옵니다. 꼬리 나머지 명단은 가져오세요.
아래 4가지 목록을 나타냅니다.
(빈 목록을 허용하기 위해) 2개의 쌍에서 각 목록노드를 구축합니다. 각 목록 노드를 1쌍에서 구축합니다. 오른쪽 접기 기능을 사용하여 목록을 표시합니다. Scott의 인코딩을 사용하여 목록 표시(match expression의 대소문자를 인수) 목록 노드로 두 쌍 사용 공백이 아닌 목록은 교회 쌍으로 구현할 수 있습니다.
첫 번째는 머리를 포함합니다. 두 번째는 꼬리를 포함합니다. 그러나 "null" 포인터가 없기 때문에 빈 목록을 나타내는 것은 아닙니다. null을 나타내기 위해 쌍은 다른 쌍으로 래핑되어 빈 값을 제공할 수 있습니다.
첫 번째 - Null 포인터(빈 목록)입니다. 둘째, 첫째는 머리를 포함합니다. 두 번째, 두 번째에는 꼬리가 포함됩니다. 이 아이디어를 사용하여 다음과 [9] 같이 기본 목록 작업을 정의할 수 있습니다.
표현 묘사 제로 ≡ 짝 진실의 진실의 \displaystyle \operatorname {true} \equiv \operatorname {true} \operatorname {true} 쌍의 첫 번째 요소는 true입니다.이것 은 리스트가 늘임을 의미합니다. 하지 않다 ≡ 첫번째 \displaystyle \operatorname {isnil} \equiv \operatorname {first} null(또는 빈 목록) 표시기를 가져옵니다. 단점 ≡ λ h . λ t . 짝 거짓의 ( 짝 h t ) \displaystyle \operatorname {cons} \equiv \displayda h.\displayda t. \operatorname {false} \ (\operatorname {false} h\t) 늘이 아닌 리스트노드를 생성하여 헤드h 와 테일t 를 지정합니다. 머리 ≡ λ z . 첫번째 ( 둘째 z ) \displaystyle \operatorname {head} \equiv \displayda z. \operatorname {first} \ (\operatorname {second} z)} 두 번째. 첫 번째는 머리입니다. 꼬리 ≡ λ z . 둘째 ( 둘째 z ) \displaystyle \operatorname {tail} \equiv \displayda z. \operatorname {second} \ (\operatorname {second} z)} second. second는 꼬리 입니다.
제로 노드 에서는 헤드 및 테일이 비어 있지 않은 목록에만 적용되는 경우 second는 액세스되지 않습니다.
목록 노드로 한 쌍 사용 또는 정의한다[10] .
단점 ≡ 짝 머리 ≡ 첫번째 꼬리 ≡ 둘째 제로 ≡ 거짓의 하지 않다 ≡ λ l . l ( λ h . λ t . λ d . 거짓의 ) 진실의 \displaystyle {cons}\equiv \operatorname {cons} &\equiv \operatorname {head} &\equiv \operatorname {first} \\operatorname {tail} &\equiv \operatorname {first} \\false \contextda d. \operatorname {false})\operatorname {true} \end{aligned}} 여기서 마지막 정의는 일반의 특수한 경우이다.
p r o c e s s - l i s t ≡ λ l . l ( λ h . λ t . λ d . h e a d - a n d - t a i l - c l a u s e ) n i l - c l a u s e \displaystyle \operatorname {process-list} \equiv \displayda l.l(\displayda h.\displayda t). \contextda d. \operatorname {head-and-tail-filename}\operatorname {filename} 오른쪽 접기를 사용 하여 목록 표시 Church 쌍을 사용한 인코딩의 대안으로 목록을 오른쪽 폴드 함수로 식별하여 인코딩할 수 있습니다. 예를 들면, 3개의 요소 x, y, z의 리스트를, 조합기 c에 적용하면, 값 n이 c x(c y(c z n))를 반환하는 상위 함수로 부호화할 수 있다.
제로 ≡ λ c . λ n . n 하지 않다 ≡ λ l . l ( λ h . λ t . 거짓의 ) 진실의 단점 ≡ λ h . λ t . λ c . λ n . c h ( t c n ) 머리 ≡ λ l . l ( λ h . λ t . h ) 거짓의 꼬리 ≡ λ l . λ c . λ n . l ( λ h . λ t . λ g . g h ( t c ) ) ( λ t . n ) ( λ h . λ t . t ) {\displaystyle}\operatorname {n} &\equiv c.\operatorname {isnil} &\equiv \operatorname {isnil} &\equiv \" l.l" (\displayda h.\t) \operatorname {false} \operatorname {true} \\operatorname {cons} &\equiv \operatorname h.\paramda t. \superda c.\c.c\h\(t\c\n)\operatorname {head} &\equiv \superda l.l\(\superda h.\superda t.h)\\operatorname {tail} &\equiv \superda l.l. \secutda c.\secutda n.l\(\secutda h.\secutda t). \subda g.g\(t\c)\(\subda t.n)\(\subda h.\subda t.t)\end {aligned}} 이 목록 표현은 시스템 F에서 유형 을 지정할 수 있습니다.
Scott 인코딩을 사용하여 목록 표시 대체 표현은 Scott 부호화입니다. Scott 부호화는 연속 이라는 개념을 사용하며 더 단순한 [11] 코드로 이어질 수 있습니다. ('Mogensen-Scott 부호화'도 참조).
이 방법에서는 패턴 매칭 식을 사용하여 목록을 관찰할 수 있다는 사실을 사용합니다. 예를 들어 Scala 표기법을 사용 하는 경우, list
type 값을 나타냅니다. List
리스트가 비어 있는 Nil
및 컨스트럭터 Cons(h, t)
우리는 목록을 조사하고 계산할 수 있다. nilCode
리스트가 비어 있을 경우 consCode(h, t)
목록이 비어 있지 않은 경우:
목록. 경기 { 사례. 제로 => 제로 코드 사례. 단점 ( h , t ) => 콘스코드 ( h , t ) } 'list'는 'nilCode' 및 'consCode'에 대해 어떻게 작용하는지 나타냅니다. 따라서 목록을 인수로서 'nilCode' 및 'consCode'를 받아들이는 함수로 정의하므로 위의 패턴 일치 대신 다음과 같이 간단히 쓸 수 있습니다.
목록. 제로 코드 콘스코드 {\displaystyle \operatorname {list} \operatorname {nilCode} \\operatorname {consCode} nilCode에 대응하는 파라미터를 'n'으로 나타내고 consCode에 대응하는 파라미터를 'c'로 나타냅니다. 빈 리스트는 null 인수를 반환하는 리스트입니다.
제로 ≡ λ n . λ c . n \displaystyle \operatorname {display} \equiv \displayda n. \sysda c.\n} 머리 'h'와 꼬리 't'가 있는 비어 있지 않은 목록은 다음과 같습니다.
단점 h t ≡ λ n . λ c . c h t \displaystyle \operatorname {cons} \h\t\\equiv \\displayda n. \sysda c.\ c\ h\ t} 보다 일반적으로 m {\displaystyle m} 개의 대안으로 이루어진 대수적 데이터 유형은 m {\displaystyle m} 개의 매개변수를 가진 함수가 된다. i\ displaystyle i}번째 컨스트럭터에 n개의 인수가 있는 경우 대응하는 부호화 파라미터에는 n개의 인수가 사용됩니다.
Scott 부호화는 타입이 없는 람다 미적분으로 할 수 있지만, 타입과 함께 사용하려면 재귀와 타입 다형성을 가진 타입 시스템이 필요합니다. 이 표현에서 요소 유형이 E인 리스트는 유형 C의 값을 계산하는 데 사용됩니다. 여기서 '=>'은 함수 유형을 나타냅니다.
유형 목록. = C => // 인수 없음 ( E => 목록. => C ) => // cons 인수 C // 패턴 매칭 결과 임의 유형을 계산하는 데 사용할 수 있는 목록의 유형은 다음과 같습니다. C
. 일반 목록[clarification needed ] E
또, E
type 인수로 지정합니다.
「 」를 참조해 주세요. 메모들 ^ a b c Trancón y Widemann, Baltasar; Parnas, David Lorge (2008). "Tabular Expressions and Total Functional Programming" . Implementation and Application of Functional Languages . 5083 : 228–229. doi :10.1007/978-3-540-85373-2_13 . ^ Jansen, Jan Martin; Koopman, Pieter W. M.; Plasmeijer, Marinus J. (2006). "Efficient interpretation by transforming data types and patterns to functions". In Nilsson, Henrik (ed.). Trends in functional programming. Volume 7 . Bristol: Intellect. pp. 73–90. CiteSeerX 10.1.1.73.9841 . ISBN 978-1-84150-188-8 . ^ "Predecessor and lists are not representable in simply typed lambda calculus" . Lambda Calculus and Lambda Calculators . okmij.org. ^ 이 공식은 f -> m, x -> f를 가진 교회 숫자의 정의입니다. ^ Allison, Lloyd. "Lambda Calculus Integers" . ^ Bauer, Andrej. "Andrej's answer to a question; "Representing negative and complex numbers using lambda calculus" " . ^ "Exact real arithmetic" . Haskell . Archived from the original on 2015-03-26. ^ Bauer, Andrej. "Real number computational software" . ^ Pierce, Benjamin C. (2002). Types and Programming Languages . MIT Press . p. 500. ISBN 978-0-262-16209-8 . ^ Tromp, John (2007). "14. Binary Lambda Calculus and Combinatory Logic". In Calude, Cristian S (ed.). Randomness And Complexity, From Leibniz To Chaitin . World Scientific. pp. 237–262. ISBN 978-981-4474-39-9 . PDF 형식: ^ Jansen, Jan Martin (2013). "Programming in the λ-Calculus: From Church to Scott and Back". In Achten, Peter; Koopman, Pieter W. M. (eds.). The Beauty of Functional Code - Essays Dedicated to Rinus Plasmeijer on the Occasion of His 61st Birthday . Lecture Notes in Computer Science. Vol. 8106. Springer. pp. 168–180. doi :10.1007/978-3-642-40355-2_12 .
레퍼런스