하스켈에 단점이나 문제가 있습니까?


47

다음 (상대적으로는) 개인 프로젝트를 위해 Haskell에 뛰어 들기를보고 있습니다. 내가 Haskell을 다루는 이유는 다음과 같습니다.

  1. 순전히 기능적인 언어로 머리를 숙여 라
  2. 속도. 나는 이것이 논쟁의 여지가 있다고 확신하지만, 손톱 Haskell을 C ++에 가깝게 보았습니다 (Erlang보다 약간 빠릅니다).
  3. 속도. 워프 웹 서버는 사실상 다른 모든 것에 비해 미친 것처럼 보입니다 .

따라서, 내가 찾고있는 것은 Haskell과 함께 제공되는 단점이나 문제입니다. 웹에는 Haskell이 왜 좋은지에 대한 엄청난 양의 정보가 있지만 추악한 측면에 대해서는 많은 주제를 찾지 못했습니다 (내가 신경 쓰지 않는 구문에 대한 그립을 제외하고).

내가 찾고있는 것의 예는 Python의 GIL과 같습니다. CPython 환경에서 동시성을 사용하기 시작했을 때까지 머리를 숙이지 않은 것.



26
저급 프로그래머가 뇌 녹는 문제를 다룬다 고 들었습니다. 치료하는 것은 매우 비싼 상태입니다.
ChaosPandion

1
@FrustratedWithFormsDesigner : 링크 주셔서 감사합니다. 그러나 여전히 Haskell에 대한 기술적 단점에 대한 언급 은 없습니다 . ;)
Demian Brecht

6
@ChaosPandion : 같은 말을 들었습니다 ..하지만 두뇌를 녹 이지 않으면 실제로 노력하고 있습니까? ;) 또한, 나는 정말 나 자신에게 낮은 프로그래머를 생각하지 않을, 그래서 나는 그것에 대해 지나치게 걱정하지 않아요)
데미안 브레히트에게

3
@ChaosPandion : 그리고 대부분의 건강 보험은 그것을 커버하지 않습니다. :(
FrustratedWithFormsDesigner

답변:


48

내가 생각할 수있는 몇 가지 단점 :

  • 언어의 본질과 학계에서의 확고한 뿌리 때문에 공동체는 매우 수학적인 생각을합니다. 실용적 인 사람이라면 때로는 압도적 일 수 있으며 전문 용어를 말하지 않으면 다른 많은 언어보다 어려움을 겪을 수 있습니다.
  • 엄청나게 많은 라이브러리가 있지만 문서는 간결합니다.
  • 부드러운 엔트리 레벨 튜토리얼은 찾기가 어렵고 찾기가 어렵 기 때문에 초기 학습 곡선은 매우 가파 릅니다.
  • 몇 가지 언어 기능이 불필요하게 어색합니다. 눈에 띄는 예는 레코드 구문이 이름 지정 범위를 도입하지 않는 방법이므로 동일한 모듈 네임 스페이스 내에서 두 개의 다른 유형으로 동일한 레코드 필드 이름을 가질 수있는 방법이 없습니다.
  • Haskell은 기본적으로 게으른 평가로 설정되며, 이는 종종 좋은 일이지만 때로는 불쾌한 방법으로 당신을 물 수 있습니다. 사소한 상황에서 게으른 평가를 순진하게 사용하면 불필요한 성능 병목 현상이 발생할 수 있으며, 후드에서 발생하는 상황을 이해하는 것은 정확하지 않습니다.
  • 게으른 평가 (특히 순도 및 적극적으로 최적화 된 컴파일러와 결합)는 실행 순서를 쉽게 추론 할 수 없다는 것을 의미합니다. 실제로 특정 상황에서 특정 코드 조각이 실제로 평가되는지 여부조차 알 수 없습니다. 결과적으로, 코드를 단계별로 실행하는 것이 덜 유용하고 덜 중요하기 때문에 Haskell 코드를 디버깅하려면 다른 사고 방식이 필요합니다.
  • Haskell의 순도 때문에 부작용을 사용하여 I / O와 같은 작업을 수행 할 수 없습니다. 대화 형 작업을 수행하려면 모나드 및 '학대'게으른 평가를 사용해야하며, I / O를 수행하려는 모든 곳에서 모나드 컨텍스트를 드래그해야합니다. (이것은 실제로 여러 가지면에서 좋은 기능이지만 때때로 실용적인 코딩이 불가능합니다.)

16
실제로 온라인에서 무료로 제공되는 정말 좋은 입문서가 있습니다. Haskell for Great Good 은 내가 읽은 최고의 초보자 용 프로그래밍 책 중 하나이며 Real World Haskell 은 훌륭한 중급 리소스입니다.
Tikhon Jelvis

1
@TikhonJelvis : 그것들은 실제로 내가 사용할 가치가있는 유일한 두 후보자입니다. "Learn You A Haskell"은 "Real World Haskell"이 저에게 도움이되었지만 프로그래밍 배경이 약간 있다고 가정했습니다. "하스켈에 대한 부드러운 소개"도 있지만, 특히 수학에 대한 배경이없는 경우에는 부드럽습니다.
tdammers

나는 "Haskell에 대한 부드러운 소개"와 "Real World Haskell"을 사용합니다. 이 둘의 조합은 많은 유용한 정보를 주었다. 나는 사소한 프로젝트를 준비하는 수준에 있지만 불행히도 시간이별로 없습니다.
Giorgio

9
"실용적인 사람이라면 ...": 나중에 많은 버그 수정을 피한다면 수학 중심 언어를 사용하는 것은 매우 실용적인 결정이 될 수 있습니다. 물론 도구를 사용하여 절약하는 시간과 도구 사용 방법을 배우는 데 필요한 추가 시간 사이의 균형을 항상 찾아야합니다.
조르지오

모나드는 엄격한 언어로 똑같이 작동합니다 (다른 언어로도). 상호 작용을 달성하기 위해 게으른 평가를 "남용"하지 마십시오. Haskell에서 엄격한 대화식 프로그램을 작성하는 것은 쉽지 않습니다.
세미콜론

19

Haskell의 단점 (및 대부분의 Haskell의 단점)은 게으르고 순전히 기능적인 두 가지 특성에서 비롯됩니다.

게으 르면 성능을 추론하기가 더 어려워집니다. 특히 게으름에 익숙하지 않은 사람, 숙련 된 Haskeller의 경우에도 게으름이 특정 경우 성능에 어떤 영향을 미치는지 알기가 어려울 수 있습니다.

게으름은 또한 Criterion과 같은 라이브러리를 사용하지 않고 정확한 벤치 마크를 만드는 것이 더 어렵다는 것을 의미합니다.

순전히 기능적이라는 것은 변경 가능한 데이터 구조를 사용해야 할 때마다 (필요한만큼 자주 발생하지 않는 GHC 옵티 마이저 덕분에 원하는 성능을 달성 할 수없는 경우), IO (또는 ST) 모나드에 갇혀 코드가 더 번거로워집니다.

속도를 목표 중 하나로 언급 했으므로 성능에 많은 생각을하지 않고 작성된 다른 손으로 최적화 된 Haskell 코드와 Haskell 코드간에 성능에 큰 차이가있는 경우가 많습니다 (다른 언어보다). 그리고 수동으로 최적화 된 Haskell 코드는 종종 매우 추악합니다 (그러나 대부분의 다른 언어에서도 마찬가지라고 생각합니다).


1
순전히 기능적인 기능은 실제로 판매 기능이며 단점이 아닙니다. "게으른"언어는 의미가 없으며, 게으른 대 엄격한 것은 유형의 문제이며, 게으른 유형과 엄격한 유형은 모두 용도가 있습니다. (따라서 Haskell은 대부분의 언어가 게으른 유형을 가지지 않아서 엄격한 유형을 가지지 않아서 절름발이입니다.) Haskell의 주요 단점은 엉터리 모듈 시스템 (모듈이 일류가 아님)과 사실 유형 클래스가 실제로 모듈성을 깨는 것입니다. "타입 당 하나의 인스턴스"규칙은 컴파일러가 타입 클래스 인스턴스의 전체 목록을 유지하도록 강제합니다).
pyon

21
"그리고 수동으로 최적화 된 Haskell 코드는 종종 매우 추악합니다 (하지만 대부분의 다른 언어에서도 마찬가지입니다)." 이. 사람들이 Haskell의 우아함을 보여주고 싶을 때 짧고 달콤한 코드를 게시합니다. 불행히도 프로덕션과 같은 양의 데이터로 실행하면 성능이 크게 저하됩니다. 사람들이 "Haskell은 C ++만큼 빠르다"는 것을 보여주고 싶을 때, 복잡하고 읽기 어려운 코드를 출판하는데, 이는 C에서 훨씬 더 읽기 쉬운 버전보다 느립니다.
quant_dev

12

저는 Haskell 전문가가 아닙니다. 기본 사항을 배웠지 만 불행히도 Haskell에서 심각한 프로젝트를 수행 할 기회가 없었습니다 (이 언어를 좋아하기 때문에 원합니다).

그러나 내가 아는 것과 기능 프로그래밍과 매우 가까운 분야에서 일하고있는 누군가와의 토론에서 Haskell은 그래프 알고리즘을 구현하려는 경우 최상의 솔루션이 아닐 수 있습니다. 그래프 구조에 대한 많은 지역 변화.

그래프에는 일반적으로 재귀 구조가 없기 때문에 가장 좋은 방법은 (C ++에서와 같이) 구조와 포인터를 사용하여 그래프의 사본 하나를 작성하고 포인터를 변경하여 사본을 조작하는 것입니다. 노드 생성 또는 파괴 등.

Haskell에 대한 지식으로 인해 위의 표현 / 접근 방식을 사용할 수 없으므로 Haskell에서 이러한 데이터 구조 및 작업을 올바르게 처리하는 방법이 궁금합니다. Haskell의 그래프 알고리즘과 관련된 몇 가지 문제는 이 기사 에서 간략하게 설명합니다.

편집하다

필자는 최근 함수 프로그래밍 전문가와 이야기를 나 Has 고 Haskell에서 특정 그래프 알고리즘을 효율적으로 구현하는 것이 매우 까다로울 수 있음을 확인했습니다.


순수한 기능 세계에서 그래프 조작 / 순회에 관한 흥미로운 메모 (및 링크). 그것을 고려하지 않았습니다.
데미안 브레히트

7
순전히 기능적인 그래프 알고리즘은 흥미로운 주제입니다. 관용적 솔루션은 포인터를 순전히 기능적인 사전으로 대체하여 명령 표현을 에뮬레이트하는 것입니다. 예를 들어 주어진 정점을 모서리가있는 정점 세트에 매핑합니다. 그러나 약한 사전을 사용하지 않으면 도달 할 수없는 하위 그래프를 수집 할 수없고 순전히 기능적인 약한 사전이 없기 때문에 메모리가 누출됩니다. 하루가 끝나면 최첨단 순수 기능 솔루션이 훨씬 더 복잡하고 덜 효율적입니다!
Jon Harrop

1
반면에, 그래프 알고리즘은 디버깅하기 어려운 것으로 악명 높고 지속적인 데이터 구조는이 문제를 완화 할 수 있습니다.
Jon Harrop

그래프 데이터 유형을 개발할 수 있는지 궁금합니다 (ByteString의 아이디어에 따라 : 효율적인 내부 표현과 변환 / 액세스 함수). 모나드를 사용하면 이러한 그래프를 변경할 수 있어야합니다. 물론 이것은 그래프 표현 문제를 다루지 만 그래프 알고리즘 구현 문제는 해결하지 못합니다.
조르지오

DAG는 하나입니다. 다른 모든 것들은 게으름을 이용하고 "매듭을 묶어"사용할 수 있습니다.
danielm

4

Haskell의 단점은 다릅니다. 더 일반적으로 배우거나 이야기하는 언어에서 멀어지기 때문에 더 큰 학습 곡선이 있습니다. 또한 언어에 대한 인기도 떨어지기 때문에 도움을받을 수 없을 때 도움을받을 수 없습니다. 이것들은 실제로 큰 단점이 아닙니다.

잠재적 단점은 기능 언어이므로 특정 문제 영역에서는 유용하지 않지만 객체 지향 언어에서도 마찬가지입니다. 일반적으로 언어는 적어도 상대적으로 인기있는 언어에 대해서는 학습 곡선 이상의 진정한 부정을 갖지 않습니다. 언어가 튜링이 완료되는 한 이론적으로는 아무 것도 가능합니다.


3
튜링 완성도는 붉은 청어입니다. 계산 이론! = 실제 프로그래밍.

1
@delnan 그것이 내가 이론적으로 말한 이유입니다
Ryathal

2
Haskell이 덜 유용하다고 주장하는 "문제 도메인"은 무엇입니까?
Andres F.

3
커뮤니티가 더 작다 는 것은 사실이지만 실제로는 활발하게 활동하고 있습니다. 프리 노드의 #haskell 채널은 언어 채널 내에서 #python 뒤에 만 있다고 생각하며, Haskell에 대한 질문에 대답하는 것은 놀랍게도 경쟁이 치열합니다 :)
Tikhon Jelvis

@AndresF. - "유용하지 않다"고 말하지는 않지만 Haskell이 아직 초기 단계를 보여주고있는 영역은 다음과 같습니다. 1) 무거운 DP-간단한 배낭 알고리즘을 코딩하여 문자 그대로 충격을 받았습니다. 천천히했다. 박스형 배열을 사용하고 있었기 때문에 약간의 오버 헤드가 예상되었지만 예상보다 훨씬 나빴습니다. 2) 큰 사소한 게임-AFRP가 초기 단계에 있으므로 특히 좋은 프레임 워크가 없으며 성능을 예측하기가 너무 어렵습니다. Haskell 버전의 Doom을 보는 데는 오랜 시간이 걸릴 것입니다. (
조각

0

그래서, 내가 찾고있는 것은 Haskell과 함께 오는 단점이나 문제입니다.

"하스켈 문제"는 특정 도메인에 나타나는 경향이 있습니다. Haskell은 응용 프로그램 프로그래밍을위한 훌륭한 언어로, 다른 어떤 것보다 훨씬 즐겁게 작성합니다. 다음과 같이 잘 지원되지 않는 작업을 수행하려고하면 문제가 발생하는 경향이 있습니다.

  • 크로스 컴파일. GHC는 크로스 컴파일러로 구축 될 수 있지만 프로세스는 다소 복잡합니다.
  • 임베디드 애플리케이션. Haskell은 가비지 콜렉터를 통한 메모리 관리 기능을 갖추고 있으므로 놀랍지 않습니다.
  • 속도. Haskell은 Rust만큼 빠르지는 않지만 대부분의 경우 상당히 잘 경쟁합니다. 순수한 계산은 잘 최적화되지만 "파일을 버퍼로 읽고 행 수를 세는 것"과 같은 것은 Haskell에서 표현하기가 더 어렵습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.