람다 미적분학에서 λx.λf.fx의 이름은 무엇입니까? 프로그래밍시 해당 기능의 표준 이름이 있습니까?


15

람다 미적분학에서 λx.λf.fx의 이름은 무엇입니까?

해당 함수의 기능 이름이 Haskell과 같은 기능 프로그래밍 언어로되어 있습니까?

객체 지향 프로그래밍에서, 일반적인 이름은 방법에 대한이 foo같은 인수로 함수를 소요 x.foo(f)반환 f(x)?


3
사전을 사야합니다.
Robert Harvey

13
어느 것? 어디? 얼마예요?
Alexey

4
다운 보트를 이해하지 못합니다. 그것은 나에게 완전히 합리적인 질문 인 것 같습니다.
조르지오

아래에 답변을 게시했지만 OP가이 람다 식의 이름을 묻고 있음을 깨달았으므로 = D를 삭제했습니다.
Jason

참조하는 개념은 콤비 네이터 ( combinator)로 알려져 있습니다. en.wikipedia.org/wiki/SKI_combinator_calculus에 익숙하지 않은 경우 여기를 읽으십시오. BCKW는 (그것의 플립) 가까이 있지만 동일하지 않습니다 en.wikipedia.org/wiki/B,C,K,W_system 좀 재미를 그 콤비의 조합과 함께 오지 않을 이유 : 함수의 결과
지미 호파

답변:


9

하스켈에서 \x.\f.f x이다 flip ($)로하는 $등 읽기 적용 나뿐만 읽을 것, 반대 적용 .

대략 /programming/4090168/is-there-an-inverse-of-the-haskell-operator 기반


이 잘못 ... 플립 \f.\x.\y.f y x플립은 C입니다 en.wikipedia.org/wiki/B,C,K,W_system
Jimmy Hoffa

또한 $이와 같이 뒤집기 위해 추가 하면 마지막 2 개만 뒤집을 2 개의 인수를 취하는 부분적으로 적용되는 함수가 필요하므로 2를 제외한 모든 것을 부분적으로 적용합니다.
Jimmy Hoffa

6
그렇다면 모듈로 이름 바꾸기로 (\f.\x.\y.f y x) (\f.\x.f x)줄어드는 것이 의심 스럽 (\x.\f.f x)습니까? 그렇습니다.
Dan D.

5

표준 결합기 를 사용 하여이 기능을 다음과 같이 표현할 수 있습니다

C I

어디

C f x y = (f y) x

하스켈에서는

flip id

여기 id의 유형에 전문 (a -> b) -> a -> bflip스왑 a -> ba.

SKI 미적분학으로 표현할 수도 있습니다 .

S (K (S I)) K

이를 위해 결합기를 추론하기위한 +1 그가 잘 알고 있다고 생각하지는 않지만 만약 그가 그것이 교회 숫자와 관련이있는 것으로 밝혀 졌을 때, CI가 다른 사람의 교회 숫자 연구와 관련이있는 곳에 문서화되어 있는지 궁금해합니다.
Jimmy Hoffa

5

원래 Alonzo Church의 "람다 변환의 계산법"에서 그는이 결합자를 T로 표시 합니다.

교회 숫자의 맥락에서 exp 라고 합니다. 이 용어의 "프로그램"에 대한 교회에서 사용되는 "속기"표기 일치 N 텀에 M을 "[ M N은 ] ''(약자 NM )".

프로그래밍에서 유사한 기능에 대한 표준 이름을 아직 들어 보지 못했습니다.


3

이것은 때때로 thrush combinator 라고하며 Clojure에서는 thread-first macro 라고합니다 . 그것은의 주요 사용 당신은 그들이에서 실행 순서대로 체인 계산의 일련의 계산을 표현 할 수입니다. 예를 들어, 값을 복용 x함수에 전달, f다음의 결과를 전달 f(x)하는 기능으로 g,로 기록 될 것입니다 g(f(x))표준 함수 구성 사용 (또는 g (f x)암시 적 괄호로 작업중인 경우) 많은 수의 연결 함수가 실행되는 순서의 역순으로 읽어야하기 때문에 어색 할 수 있습니다. 아구창 조합기를 다음과 같이 정의하면 아구창 조합기를 사용하여이를 다르게 표현할 수 있습니다.

T x f = f x
T x f g ... = T (T x f) g ...

그런 다음식이 T x f g h됩니다 h (g (f x)).

(자세한 정보와 라켓 언어의 구체적인 구현을 원하는 사람들을 위해, 나는 라켓의 아구창 조합에 대한 블로그 게시물을 가지고 있습니다 )


2

귀하의 질문을 올바르게 이해하기를 희망하지만 이것이 ML 언어의 (역) 파이프 연산자라고 알려져 있습니다.

[1; 2; 3] |> List.map sq // let it = [1; 4; 9]

작업 순서를 도와주는 리버스 파이프 연산자도 있습니다.

printf "The value is.." <| 2 + 3 // let it = "The value is..5"

unpiped 형식 때문에 유용합니다

printf "The value is.." 2 + 3 ;; error

printf가 평가하려고 시도하기 때문에 오류가 발생 "The value is.." 2하고 정의 된 +연산자 가 없기 때문에 오류가 발생 합니다. 이 작업을 수행하려면 괄호를 사용하십시오.

printf "The value is.." (2 + 3) // let it = "The value is..5"

실제 사용과 관련하여 |>운영자는 F #, LiveScript 및 Elixir와 같은 ML 및 ML에서 영감을 얻은 많은 언어의 빵집과 버터를 매우 유용하게 사용할 수 있습니다. <|덜 일반적이며 일반적으로 가독성을 높일 때만 사용됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.