[haskell] Haskell에 대한 소란은 무엇입니까? [닫은]

나는 그들 사이에있을 때 Haskell에 대해 계속 이야기하는 몇몇 프로그래머를 알고 있으며, 여기에서는 모두가 그 언어를 좋아하는 것 같습니다. Haskell에 능숙하다는 것은 천재 프로그래머의 특징 인 것 같습니다.

누군가가 왜 그렇게 우아하고 우수한지 보여주는 몇 가지 Haskell 예제를 줄 수 있습니까?



답변

그것이 저에게 제시된 방식, 그리고 지금 한 달 동안 Haskell에서 학습 한 후 사실이라고 생각하는 것은 함수형 프로그래밍이 흥미로운 방식으로 당신의 두뇌를 뒤틀린다는 사실입니다. 익숙한 문제에 대해 여러 가지 방식으로 생각하게합니다. : 루프 대신 맵과 접기 및 필터 등으로 생각하십시오. 일반적으로 문제에 대해 둘 이상의 관점이있는 경우이 문제에 대해 추론하고 필요에 따라 관점을 전환 할 수 있습니다.

Haskell의 또 다른 멋진 점은 타입 시스템입니다. 엄격하게 유형이 지정되어 있지만 유형 추론 엔진은 바보 같은 유형 관련 실수를했을 때 마술처럼 알려주는 Python 프로그램처럼 느껴집니다. 이와 관련하여 Haskell의 오류 메시지는 다소 부족하지만 언어에 익숙해지면 스스로에게 말할 것입니다 : 이것이 타이핑이되어야하는 것입니다!


답변

이것은 내가 Haskell을 배우도록 설득 예입니다.

-- program to copy a file --
import System.Environment

main = do
         --read command-line arguments
         [file1, file2] <- getArgs

         --copy file contents
         str <- readFile file1
         writeFile file2 str

좋습니다. 짧고 읽기 쉬운 프로그램입니다. 그런 의미에서 C 프로그램보다 낫습니다. 그러나 이것이 매우 유사한 구조를 가진 파이썬 프로그램과 어떻게 다른가요?

대답은 게으른 평가입니다. 대부분의 언어 (일부 기능적 언어 포함)에서 위와 같이 구조화 된 프로그램은 전체 파일이 메모리에로드 된 다음 새 이름으로 다시 작성됩니다.

Haskell은 “게으른”사람입니다. 필요할 때까지 계산하지 않으며, 더 이상 필요 하지 않은 것을 계산 하지 않습니다 . 예를 들어, 만약 당신이 writeFile줄 을 제거한다면 , Haskell은 처음에 파일에서 아무것도 읽지 않을 것입니다.

그대로 Haskell은가에 writeFile의존 한다는 것을 인식 readFile하고이 데이터 경로를 최적화 할 수 있습니다.

결과는 컴파일러에 따라 다르지만 위 프로그램을 실행할 때 일반적으로 발생하는 일은 다음과 같습니다. 프로그램은 첫 번째 파일의 블록 (예 : 8KB)을 읽은 다음 두 번째 파일에 쓴 다음 첫 번째 파일에서 다른 블록을 읽습니다. 두 번째 파일에 씁니다. (실행 해보세요 strace!)

… 이것은 파일 복사의 효율적인 C 구현이하는 것과 매우 유사합니다.

따라서 Haskell을 사용하면 많은 성능을 저하시키지 않고 간결하고 읽기 쉬운 프로그램을 작성할 수 있습니다.

내가 추가해야 할 또 다른 것은 Haskell이 단순히 버그가있는 프로그램을 작성하는 것을 어렵게 만든다는 것입니다. 놀라운 유형 시스템, 부작용 부족, 물론 Haskell 코드의 간결함은 최소한 세 가지 이유로 버그를 줄입니다.

  1. 더 나은 프로그램 디자인. 복잡성이 감소하면 논리 오류가 줄어 듭니다.

  2. 간결한 코드. 버그가있을 줄이 적습니다.

  3. 컴파일 오류. 많은 버그 는 유효한 Haskell이 아닙니다 .

Haskell이 모든 사람을위한 것은 아닙니다. 그러나 모두가 그것을 시도해야합니다.


답변

당신은 잘못된 질문을하고 있습니다.

하스켈은 몇 가지 멋진 예제에서 살펴 가서가는 언어가 아닙니다 “아하, 내가 지금 참조 입니다 그것은 좋은 만드는 것!”

마치, 우리는 다른 모든 프로그래밍 언어를 가지고 있고, 그것들은 모두 다소 비슷합니다. 그리고 완전히 다르고 엉뚱한 Haskell이 있습니다. 일단 당신이 괴팍함에 익숙해지면 완전히 굉장합니다. 그러나 문제는 그 괴팍함에 적응하는 데 꽤 오랜 시간이 걸린다는 것입니다. Haskell을 다른 거의 모든 준 주류 언어와 차별화시키는 요소 :

  • 게으른 평가
  • 부작용 없음 (모든 것이 순수하고 IO / etc는 모나드를 통해 발생 함)
  • 놀랍도록 표현력이 풍부한 정적 유형 시스템

뿐만 아니라 많은 주류 언어와는 다른 (하지만 일부에서 공유하는) 몇 가지 다른 측면 :

  • 기능의
  • 중요한 공백
  • 유추 된 유형

다른 포스터가 대답했듯이 이러한 모든 기능의 조합은 완전히 다른 방식으로 프로그래밍에 대해 생각한다는 것을 의미합니다. 그래서 이것을 Joe-mainstream-programmer에게 적절하게 전달하는 예 (또는 일련의 예)를 생각해 내기는 어렵습니다. 그것은 경험적인 것입니다. (비유하자면 1970 년 중국 여행 사진을 보여 드릴 수는 있지만 사진을보고 나면 그 기간 동안 그곳에서 살았던 것이 어떤 것인지 알 수 없습니다. 마찬가지로 Haskell을 보여 드릴 수 있습니다. ‘quicksort’이지만 Haskeller라는 것이 무엇을 의미하는지 여전히 알 수 없습니다.)


답변

Haskell을 진정으로 차별화하는 것은 함수형 프로그래밍을 적용하기 위해 설계에서들이는 노력입니다. 거의 모든 언어로 기능적인 스타일로 프로그래밍 할 수 있지만, 처음에는 포기하기가 너무 쉽습니다. Haskell은 함수형 프로그래밍을 포기하는 것을 허용하지 않으므로 논리적 인 결론에 도달해야합니다. 이는 추론하기 더 쉬운 최종 프로그램이며 가장 까다로운 유형의 버그 전체를 피해야합니다.

실제 사용을위한 프로그램을 작성할 때 Haskell이 실용적인 방식이 부족하다는 것을 알 수 있지만, 처음부터 Haskell을 아는 것이 최종 솔루션이 더 좋습니다. 나는 아직 거기에 있지 않지만 지금까지 Haskell을 배우는 것은 Lisp가 대학에 있었다고 말하는 것보다 훨씬 더 깨달았습니다.


답변

소란의 일부는 순도와 정적 타이핑이 공격적인 최적화와 결합 된 병렬성을 가능하게한다는 것입니다. 병렬 언어는 이제 멀티 코어가 약간 파괴적이어서 뜨겁습니다.

Haskell은 빠른 네이티브 코드 컴파일러와 함께 거의 모든 범용 언어보다 더 많은 병렬 처리 옵션을 제공합니다. 병렬 스타일에 대한 이러한 종류의 지원에는 경쟁이 없습니다.

따라서 멀티 코어 작업에 관심이 있다면 Haskell이 할 말이 있습니다. 시작하기 좋은 곳 은 Haskell의 병렬 및 동시 프로그래밍에 대한 Simon Peyton Jones의 자습서입니다 .


답변

소프트웨어 트랜잭션 메모리 는 동시성을 처리하는 매우 멋진 방법입니다. 메시지 전달보다 훨씬 유연하며 뮤텍스처럼 교착 상태가 발생하지 않습니다. GHC의 STM 구현은 최고 중 하나로 간주됩니다.


답변

저는 작년에 Haskell을 배우고 그 안에 상당히 크고 복잡한 프로젝트를 작성하는 데 보냈습니다. (이 프로젝트는 자동화 된 옵션 거래 시스템이며 거래 알고리즘에서 저수준, 고속 시장 데이터 피드의 구문 분석 및 처리에 이르기까지 모든 것이 Haskell에서 수행됩니다.) 훨씬 더 간결하고 이해하기 쉽습니다. 적절한 배경)은 Java 버전보다 매우 강력합니다.

아마도 저에게 가장 큰 승리는 모노 이드, 모나드 등과 같은 것을 통해 제어 흐름을 모듈화하는 능력이었습니다. 아주 간단한 예는 Ordering monoid입니다. 다음과 같은 표현에서

c1 `mappend` c2 `mappend` c3

어디 c1그래서 반환에 LT, EQ또는 GT, c1반환 EQ원인을 식을 평가, 계속 c2; c2반환 되는 경우 LT또는 GT그것은 전체의 값이며 c3평가되지 않습니다. 이런 종류의 것은 모나 딕 메시지 생성기 및 구문 분석기와 같은 것에서 상당히 더 정교하고 복잡해집니다. 여기서는 여러 유형의 상태를 처리하거나, 다양한 중단 조건을 가지고 있거나, 중단이 실제로 의미하는지 여부를 특정 호출에 대해 결정할 수 있기를 원할 수 있습니다. “추가 처리 안 함”또는 “마지막에 오류를 반환하지만 추가 오류 메시지 수집을 위해 계속 처리”를 의미합니다.

이것은 모두 배우는 데 약간의 시간과 노력이 필요하므로 이러한 기술을 아직 모르는 사람들을 위해 설득력있는 주장을하기가 어려울 수 있습니다. 모나드모든 것 튜토리얼이 이것의 한 측면에 대한 꽤 인상적인 시연을 제공 한다고 생각 하지만, 이미 자료에 익숙하지 않은 사람이 이미 첫 번째 또는 심지어 세 번째,주의 깊게 읽었을 때 “그것을 얻을”것이라고는 기대하지 않습니다.

어쨌든 Haskell에는 다른 좋은 것들이 많이 있지만, 이것은 내가 자주 언급하지 않는 주요한 것입니다. 아마도 그것은 다소 복잡하기 때문일 것입니다.