문제

나는 최근에 기능 프로그래밍에 대해 조금 읽었으며 Y- 흡착기를 맥주하려고 노력하고 있습니다. y-combinator를 사용하여 재귀를 직접 지원하지 않는 언어로 재귀를 효과적으로 구현할 수 있음을 이해합니다. 그러나 내가 사용할 가능성이있는 모든 언어는 이미 재귀를 지원하므로 Y- 콤바네이터를 사용하는 것이 얼마나 유용한 지 잘 모르겠습니다.

내가 누락 된 Y- 흡착기 사용법의 더 나은 실용적인 예가 있습니까? 실제로 실제 생산 코드에서 하나를 사용한 사람이 있습니까? 또는 Y- 흡착기를 사용하고 있습니다.

도움이 되었습니까?

해결책

나는 다른 답변에 동의하지 않을 것입니다. 고정점 (y) 콤비네이터 하다 실제 응용 프로그램이 있습니다, 그러나 그들을 찾는 데는 매우 상상력이 높은 마음이 필요합니다. 브루스 맥아담처럼. 여기 그의 논문의 초록이 있습니다 그것을 마무리합니다:

고정 점을 계산하기위한 Y 콤바이터는 표준 ML로 표현 될 수있다. 이는 고차 기능의 힘의 예로 자주 사용되지만 일반적으로 유용한 프로그래밍 구성으로 간주되지는 않습니다. 여기서, 우리는 Y 콤비네이터 및 랩퍼를 기반으로하는 프로그래밍 기술이 프로그래머에게 코드를 다시 쓰고 재 작성하지 않고는 불가능하지 않은 기능의 내부 작업에 대한 수준의 제어를 제공 할 수있는 방법을 살펴 봅니다. 실험으로, 유형-관계 알고리즘 W는이 기술을 사용하여 구현되므로 오류 메시지가 알고리즘에 대한 최소 간섭으로 생성됩니다. 이 예제 프로그램의 코드는 개념의 진정한 유용성과 적용 할 수있는 용이성을 보여줍니다. 예외 및 연속의 사용을 시뮬레이션하기 위해 고차 기능을 사용하는 것을 포함하여 여러 다른 구현 기술 및 가능한 응용 프로그램에 대해서도 논의됩니다.

훌륭한 논문입니다. 기능 프로그래밍에 관심이있는 사람은 아마도 그것을 읽는 것을 좋아할 것입니다.

다른 팁

C#에서 y 콤비네이터 구현에 대한이 멋진 게시물을 확인할 수 있습니다. 재귀 람다 표현, 그것은 아이디어를 더 잘 이해하는 데 도움이 될 수 있습니다.

Wikipedia에서 멋진 기사를 확인하고 싶을 수도 있습니다. 고정점 조합 그리고 고정 지점 정리

Nathan이 말했듯이, 많은 기능적 기술은 Y 조합과 관련이 있으며 유용하므로 유지하십시오! Y는 코드를 더 잘 이해할 수 있기 때문에 정말 유용하지만, 그것이 어떻게 도움이되는지 설명하는 데 특히 도움이되지 않는다고 생각합니다.

콤바네이터를 기능을 실행하는 가상 머신으로 생각할 수 있으며, 이는 비수체 적 기능 (= 고차 기능)으로 설명합니다.

때로는이 콤비네이터를 프로그램 제어하에, 측면 지향 프로그래밍 (메모 화, 추적, ...)과 유사한 일을하는 것이 좋지만 내가 아는 프로그래밍 언어는 허용하지 않습니다. 아마도 대부분의 시간 동안 너무 번거롭거나 배우기가 너무 어려울 것입니다.

내가 틀렸다면 다른 사람들이 나를 교정 할 수 있지만, y 콤비네이터가 엄격하게 학문적이라고 확신합니다. 그것에 대해 생각해보십시오 : 그것을 구현하려면 언어는 고차 기능을 지원하지만 재귀는 아닙니다. 내가 알고있는 언어는 단 하나뿐입니다 : Lambda 미적분학.

따라서 기계가 튜링 머신에서 람다 미적분학 실행으로 전환 될 때까지 Y 콤바이터는 엄격하게 학문적입니다.

참고 : Y 조합과 관련된 기타 기능 기술 ~이다 유용하므로 유지하십시오. Y 콤바이터를 이해하면 연속, 게으른 평가 등을 이해하는 데 도움이됩니다.

let sprite = pipe4 sprite_start blanks (manyTill attribute newline) blanks (fun a b c _ -> Sprite(a,c))

let sprites = 
    let rec y f x = f (y f) x // The Y Combinator
    //let rec sprites_up = many1Indents sprite sprites_up |>> (fun x -> SubSprites x) // Does not work.
    let sprites_up = y (fun f -> many1Indents sprite f |>> (fun x -> SubSprites x))
    many1Indents sprite sprites_up

다음은 F#에서 만들고있는 작은 게임 라이브러리의 컴파일러의 예입니다. 보다 구체적으로, 위의 내용에서 나는 Sprites_up이 재귀 적으로 스스로를 호출해야한다면 들여 쓰기 파서가 올바르게 작동하지 않을 것입니다.

y 콤비네이터가 없으면 파서를 제대로 할 수 없었고 다음과 같은 글을 쓰는 데 의지해야했을 것입니다.

let sprites_up4 = many1Indents sprite error |>> (fun x -> SubSprites x) 
let sprites_up3 = many1Indents sprite sprites_up4 |>> (fun x -> SubSprites x) 
let sprites_up2 = many1Indents sprite sprites_up3 |>> (fun x -> SubSprites x) 
let sprites_up1 = many1Indents sprite sprites_up2 |>> (fun x -> SubSprites x) 
let sprites_up = many1Indents sprite sprites_up1 |>> (fun x -> SubSprites x) 

훌륭한 솔루션이 아니었을 것입니다. Y 콤비네이터는 저를 저를 저축했습니다. 그래도 가장 먼저 떠오른 것은 아니 었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top