Haskell과 Lisp의 어떤 맛을 경험 한 분들에게 Haskell 대 Lisp로 코드를 작성하는 것이 얼마나 “즐거운”(끔찍한 용어를 사용하는지) 궁금합니다.
몇 가지 배경 : 저는 지금 Haskell을 배우고 있으며, 이전에 Scheme 및 CL과 함께 작업했습니다 (그리고 Clojure에 대해 약간의 진출). 전통적으로, 당신은 그들이 제공하는 간결함과 신속성 때문에 저를 동적 언어의 팬이라고 생각할 수있었습니다. Lisp 매크로는 장황함과 상용구를 피할 수있는 또 다른 방법을 제공했기 때문에 금방 사랑에 빠졌습니다.
나는 Haskell이 내가 존재하는지 몰랐던 코딩 방법을 소개하면서 매우 흥미 롭다는 것을 발견 하고 있습니다. 부분 함수 작성의 용이성과 같이 민첩성을 달성하는 데 도움이 될 것 같은 측면이 분명히 있습니다. 그러나 나는 Lisp 매크로를 잃어 버리는 것에 대해 약간 걱정하고 있습니다 (나는 그것들을 잃어버린 것으로 가정합니다; 진실은 아직 그것들에 대해 배우지 않았을 수도 있다는 말입니까?)과 정적 타이핑 시스템.
양 세계에서 상당한 양의 코딩을 해본 사람이 경험이 어떻게 다른지, 당신이 선호하는 것이 무엇인지, 그리고 선호가 상황에 따른 것인지에 대해 언급 할 수 있습니까?
답변
짧은 답변:
- 매크로로 할 수있는 거의 모든 것을 고차 함수 (그리고 모나드, 화살표 등을 포함)로 할 수 있지만 더 많은 생각이 필요할 수 있습니다 (하지만 처음에만, 재미 있고 당신은 더 나은 프로그래머),
- 정적 시스템은 결코 당신의 방식으로 얻을 수 없다는 것을 충분히 일반적이며, 다소 놀랍게도 실제로 프로그램은 올바른 거의 확신 할 수 컴파일 할 때 때문에, 그래서 (당신이 말한대로) “민첩성을 달성 보조” 확신은 할 수 있습니다 당신은 시도 다른 방법으로는 시도하기가 두려울 수있는 것들-Lisp와 같지는 않지만 프로그래밍에 “동적”느낌이 있습니다.
[참고 : Lisp 에서처럼 매크로를 작성할 수 있는 ” Template Haskell “이 있지만 엄밀히 말하면 절대 필요 하지 않습니다 .]
답변
우선, 동적 타이핑과 같은 특정 기능을 잃어 버릴 염려가 없습니다. 놀랍도록 잘 설계된 언어 인 Common Lisp에 대해 잘 알고 있기 때문에 언어를 기능 세트로 축소 할 수 없다는 것을 알고 있다고 가정합니다. 그것은 모두 일관된 전체에 관한 것입니다.
이와 관련하여 Haskell은 Common Lisp만큼 밝게 빛납니다. 이 기능이 결합되어 코드를 매우 짧고 우아하게 만드는 프로그래밍 방법을 제공합니다. 매크로의 부족은 모나드 및 화살표와 같은보다 정교한 (그러나 이해하고 사용하기 더 어려운) 개념으로 다소 완화됩니다. 정적 유형 시스템은 대부분의 객체 지향 언어 에서처럼 방해가되지 않고 힘을 더합니다.
반면에 Haskell의 프로그래밍은 Lisp보다 훨씬 덜 상호 작용하며 Lisp와 같은 언어에 존재하는 엄청난 양의 반사는 Haskell이 가정하는 세계의 정적 인 관점에 맞지 않습니다. 따라서 사용할 수있는 도구 세트는 두 언어간에 상당히 다르지만 서로 비교하기는 어렵습니다.
저는 개인적으로 Lisp 방식의 프로그래밍을 선호합니다. 제가 더 잘 일하는 방식에 적합하다고 생각하기 때문입니다. 그러나 이것이 당신이 그렇게 할 의무가 있음을 의미하지는 않습니다.
답변
많은 것이 모나드를 중심으로 구조화 될 수 있고 추가 된 구문으로 인해 임베디드 DSL이 트리처럼 보이지 않기 때문에 Haskell에서 메타 프로그래밍에 대한 필요성이 Common Lisp보다 적습니다. 그러나 ShreevatsaR 에서 언급했듯이 항상 Template Haskell, 심지어 Liskell (Haskell semantics + Lisp 구문) 괄호가 마음에 들면.
답변
매크로와 관련하여 여기에 대해 설명하는 페이지가 있습니다. Hello Haskell, Goodbye Lisp . Haskell에서 매크로가 필요하지 않은 관점을 설명합니다. 비교를위한 간단한 예가 함께 제공됩니다.
두 인수의 평가를 피하기 위해 LISP 매크로가 필요한 경우의 예 :
(defmacro doif (x y) `(if ,x ,y))
Haskell이 매크로 정의와 같은 것이 필요하지 않고 두 인수를 체계적으로 평가하지 않는 경우의 예 :
doif x y = if x then (Just y) else Nothing
그리고 voilà
답변
저는 Common Lisp 프로그래머입니다.
얼마 전에 Haskell을 사용해 본 경험은 CL을 고수하는 것이 었습니다.
원인:
- 동적 타이핑 (동적 타이핑 vs. 정적 타이핑 — Pascal Costanza의 패턴 기반 분석 확인 )
- 선택적 및 키워드 인수
- 매크로를 사용하는 균일 한 동음이 파 목록 구문
- 접두사 구문 (우선 순위 규칙을 기억할 필요 없음)
- 불순하므로 빠른 프로토 타이핑에 더 적합합니다.
- Meta-Object 프로토콜을 사용하는 강력한 개체 시스템
- 성숙한 표준
- 다양한 컴파일러
Haskell은 물론 고유 한 장점을 가지고 있으며 근본적으로 다른 방식으로 몇 가지 일을 수행하지만 장기적으로는 그것을 줄이지 않습니다.
답변
Haskell에서는 LISP에서는 불가능한 if 함수를 정의 할 수 있습니다. 이는 프로그램에서 더 많은 모듈성을 허용하는 게으름 때문에 가능합니다. 이 고전적인 논문 : John Hughes가 FP가 중요한 이유 는 게으름이 구성 성을 향상시키는 방법을 설명합니다.
답변
Haskell에서는 (가능하다면) 성가신 매크로로 Lisp에서 얻을 수있는 정말 멋진 일들이 있습니다. 예를 들어 ‘memoize’매크로를 사용합니다 (Peter Norvig의 PAIP 9 장 참조). 그것으로, 당신은 foo라고하는 함수를 정의 할 수 있고, foo의 전역 정의를 메모 된 버전으로 대체하는 (memoize ‘foo) 간단히 평가할 수 있습니다. 고차 함수를 사용하여 Haskell에서 동일한 효과를 얻을 수 있습니까?