2012-05-17 3 views
4

어떤 FP 언어가 람다 미적분에 뒤 따르는가? 코드 룩어 미적분 추상화처럼 보이고, 느끼고, 감동 하는가?어떤 FP 언어가 람다 미적분에 가장 가깝습니까?

+0

나는 이것이 주관적이기 때문에 닫기로 결정했다 ... – home

+0

"나는 이것이 중요한지 아닌지에 대한 의견을 듣고 싶다."그것은 물론 당신의 요구 사항에 달려 있지만, 왜 그렇게 될지는 모르겠다.) 당신의 목표가 람다 미적분을 배우는 것이 아니라면 (어쨌든 "진짜"프로그래밍 언어 대신에 람다 미적분을 직접 구현해야한다). – sepp2k

+0

@ sepp2k : 나의 딜레마는 이것입니다 : lc가 얼마나 중요한지, FP의 근원지에있는 것을 들었지만 FP 언어 x, y, z를 배우려고합니다. 그리고 그들은 모두 형식적으로 직접적인 비교를 피하는 것 같습니다. lc. 초보자에게 이것은 혼란스럽고 혼란 스럽습니다. – melwasul

답변

3

람다 미적분학은 매우 제한적인 프로그래밍 모델입니다. 당신은 오직 기능 만 가지고 있습니다. 리터럴이없고, 산술 연산자가 내장되어 있지 않으며 데이터 구조가 없습니다. 모든 것은 함수로 인코딩됩니다. 따라서 대부분의 함수형 언어는 람다 미적분을 일상 프로그래밍에 더욱 편리하도록 확장합니다.

하스켈은 현대 언어 확장 람다를 핵심 언어로 사용합니다 : System F, 데이터 유형이 확장되었습니다. (GHC는 이후이 유형을 평등 강제 형을 지원하는 System Fc으로 확장했다.

모든 하스켈은 핵심 언어로 직접 작성 될 수 있으며 핵심 언어는 형식화 된 람다 미적분학 (특히 2 차 람다 미적분학)의 확장이며, 하스켈은 람다 미적분학을 밀접하게 따르고, 병행 성을위한 내부 연산자; 병행; 및 메모리 부작용 (및 FFI)이 있습니다. 이것은 새로운 컴파일러 최적화의 개발을 상당히 쉽게 만들어 주며 주어진 프로그램의 의미를 이해하기 쉽도록 만듭니다.

반면에 Scheme은 부작용 및 기타 비 λ 계산 개념 (예 : 동시 처리 프리미티브)으로 확장 된 유형이 지정되지 않은 람다 미적분의 변형입니다. 형식이 지정되지 않은 람다 계산법을 자세히 따르라고 말할 수 있습니다.

이 중요한 사람들은 다음과 같습니다. 람다 미적분을 배우는 사람들. 및 컴파일러 작성자.

+1

처음에 UNtyped 미적분을 의미 했습니까? – sepp2k

5

이것은 실제 답변이 아닐 수도 있습니다. 실제로 원하는 것을 더 많이 추측 할 수 있습니다.

일반적으로 람다 계산법에는 거의 기능이 없습니다. 기본적으로 (1 급) 함수, 함수 응용 프로그램 및 변수가 필요합니다. 요즘은 이 아니고을 제공하는 언어를 찾는 데 어려움을 겪습니다 ... 그러나 그것에 대해 배우려고하면 혼란 스러울 수 있습니다. 예를 들어, 사용하기가 매우 쉽습니다. 평범한 숫자와 교회 숫자가 뒤섞 이도록하십시오. (나는 많은 학생들에게 이런 일이 일어난 것을 본 적이있다.이 자료에 필요한 정식 생각에 적응하는 것은 어려운 일이다.)

Don이 말했듯이, Scheme은 "일반"타입이 지정되지 않은 람다 미적분에 매우 가깝습니다. Little Schemer를 사용하는 경우에는 아마도 여러분의 경우에 적합 할 것입니다. "적절한"LC를 실제로 사용하려면 함수 (위와 같은 문제) 만 사용해야합니다. 그러나 특히 당신이 주제에 대한 다른 여러 텍스트를 읽을 때 몇 가지 추가 문제가 있습니다. 첫째, 대부분의 텍스트는 이 아니고 게으른 평가를 사용합니다. 스키마를 얻지 못합니다. 둘째로, LC는 단항 함수만을 가지고 있기 때문에 용어를 줄이고 Schema에서 λx.(λy.(λz.((z x) y))) 또는 (lambda (x) (lambda (y) (lambda (z) ((z x) y)))) 인 "실제"형식 대신 과 같이 사용하는 것이 매우 일반적입니다. (Currying이라고합니다.)

그래, Scheme은 LC에 매우 가깝지만,이 모든 문제에 대해서는별로 언급하지 않았습니다. Haskell은 게으르다. 함수에 대한 여러 인자에 대해 그런 종류의 currying을 수행하기 때문에 하스켈은 틀림없이 더 나은 후보이다. OTOH, 당신은이 게임에 들어갈 수있는 큰 짐 인 타이핑 언어를 다루고 있습니다. TLS 스타일의 예제를 사용하려고하면 진흙탕에 빠지게 될 것입니다 ...

게으름 뱅이, 생략 형, 형식화되지 않은 값을 모두 Scheme에 가깝게 가져 오려면 Racket을 고려해야합니다. 상위 레벨에서는 Scheme과 매우 비슷하지만, Racket 언어의 제한 인 언어를 단지 lambda 표현식 및 함수 응용 프로그램으로 신속하게 제거 할 수 있다는 점에서 훨씬 더 멀리 나아갑니다. 좀 더 많은 작업을하면 커리를 할 수도 있고 게으르게 만들 수도 있습니다. 이것은 실제로 당신이 스스로해야만하는 운동은 아닙니다. 그러나 원하는대로 들리면 my course (클래스 노트에서 "Schlac"을 찾으십시오)이라는 언어를 사용합니다. 위의 모든 작업을 수행하며 제한적이므로 기본 LC 구문 외에는 아무 것도 얻지 못합니다. 예를 들어, 3까지 바인드되지 않은 식별자입니다.을 정의하십시오.이 코드는 라켓 코드로 컴파일되어 있으므로 숫자를 사용하는 코드를 작성할 수있을 정도로 충분히 빠르게 실행됩니다. 해당 언어에 대한 구현도 제공 할 수 있으며, 일단 설치하면 #lang pl schlac으로 파일을 시작하면이 언어를 사용할 수 있습니다.