Haskell과 F #의 주요 차이점은 무엇입니까? [닫은]


135

F #Haskell 을 비교하기 위해 인터넷에서 검색 했지만 실제로 결정적인 것을 찾지 못했습니다. 주요 차이점은 무엇이며 왜 다른 하나를 선택해야합니까?


1
F #의 좋은 점은 혼합 된 패러다임으로 인해 OO 프로그래머에게 더 나은 시작점을 제공한다는 것입니다. 그는 점차적으로 기능적 사고에 속도를 내고 C #에서와 마찬가지로 익숙한 OO 라이브러리를 사용하는 것으로 돌아갈 수 있습니다. Haskell은 모든 기능을 한꺼번에 강제합니다.
Mario

F #은 함수형 프로그래밍 언어가 아니라는 점에 유의해야합니다. 그러나 FP에서 상당히 많은 것을 채택했기 때문에 아마도 많은 유사점을 찾을 수 있지만 그럼에도 불구하고 주로 나는 완전히 다른 언어라고 말하고 싶습니다.
MasterMastic

답변:


128

Haskell은 "순수한"기능적 언어로, F #은 명령형 / OO 및 기능적 언어의 측면을 모두 가지고 있습니다. Haskell은 또한 기능적 언어에서 매우 드문 지연 평가를 가지고 있습니다.

이것들은 무엇을 의미합니까? 순수한 기능적 언어는 부작용 (또는 함수가 호출 될 때 공유 상태의 변경)이 없음을 의미합니다. 즉, f (x)를 호출하면 함수에서 값을 반환하는 것 외에 다른 일이 발생하지 않음을 보장합니다. 콘솔 출력, 데이터베이스 출력, 전역 또는 정적 변수에 대한 변경 .. Haskell은 순수하지 않은 함수 (모나드를 통해)를 가질 수 있지만 선언을 통해 '명시 적으로'함축되어야합니다.

순수 함수형 언어와 '부작용 없음'프로그래밍은 최근 수많은 잠금 및 세마포어보다 공유 상태가없는 경우 잘못되기가 훨씬 더 어렵 기 때문에 다중 코어 동시성에 적합하기 때문에 최근 인기를 얻고 있습니다.

지연 평가는 절대적으로 필요할 때까지 함수가 평가되지 않는 곳입니다. 필요하지 않을 때 많은 작업을 피할 수 있음을 의미합니다. 다음과 같은 기본 C # if 절에서 이것을 생각해보십시오.

if(IsSomethingTrue() && AnotherThingTrue())
{
    do something;
}

경우는 IsSomethingTrue()다음 거짓AnotherThingTrue() 방법은 평가되지 않습니다.

Haskell은 놀라운 언어이지만 F # (당분간)의 주요 이점은 CLR 위에 있다는 것입니다. 이것은 다중 언어 프로그래밍에 적합합니다. 언젠가는 웹 UI를 ASP.net MVC로, 비즈니스 로직을 C #으로, 핵심 알고리즘을 F #으로, 단위 테스트를 Ironruby로 작성할 수 있습니다 .... 모든 .Net 프레임 워크에서.

Haskell에 대한 자세한 정보는 Simon Peyton Jones와 함께 Software Engineering 라디오를 들으십시오 : Episode 108 : 함수형 프로그래밍 및 Haskell에 대한 Simon Peyton Jones


8
F #의 또 다른 잠재적 인 주요 이점 (상황에 따라 다름)은 게으르지 않다는 것입니다. 즉, 시공간 동작에 대한 추론을위한 학습 곡선이 거의 모든 사람에게 훨씬 간단 해집니다.
cjs

5
se-radio 에피소드 108 (Simon Peyton Jones)에 직접 연결 : se-radio.net/podcast/2008-08/…
Herrmann

9
지적 할 가치가있는 또 다른 기능은 순수한 프로그래밍을 강제하는 언어 인 컴파일러가 많은 최적화에 대해 훨씬 더 자유 롭다는 것입니다. 순수성을 장려하지만 검사되지 않은 불순한 작업이 코드 블록 내부에 드롭되도록 허용하는 F #과 같은 언어는 컴파일러가 모든 호출에 필요한 부작용이 포함되어 있다고 가정해야하기 때문에 잠재적 인 최적화에서 손실됩니다.
Ben

12
@JonHarrop : 컴파일러 최적화의 적용 가능성과 관련이없는 알고리즘에 대한 설명입니다. 강제 순도 언어를 사용하면 일반적으로 필요한 경우 명시 적으로 불순한 코드를 작성할 수 있습니다 (다른 것이 없으면 FFI를 사용하여 C를 호출). 컴파일러는 (알 수없는) 부작용의 순서를 유지하도록 바인딩되지 않은 경우 코드 변환을 더 자유롭게 적용 할 수 있습니다. "권장 된 순도"언어에서는 대부분 유사한 코드를 작성하므로 동일한 최적화가 적용 가능할뿐 아니라 부작용 만 무효화 될 수 있습니다 (하지만 컴파일러는이를 가정 할 수 없음).
Ben

3
@JonHarrop 언제 그들이 모든 알고리즘이라고 주장 했습니까? 어쨌든 우리는 Haskell과 C가 아닌 Haskell과 F #을 비교하고 있습니다. F #은 "권장 된 순도"언어이므로 종종 순수한 코드를 작성합니다. 내가 주장하는 것은 F # 컴파일러가 호출에 부작용이 있다고 가정해야하기 때문에 "강제 된 순도"설정에서 컴파일러에 의해 똑같은 코드 가 종종 더 잘 최적화 될 수 있다는 것입니다. 다른 알고리즘 (부작용에 따라 달라지는 알고리즘)을 사용하도록 코드를 다시 작성하는 것에 대해 이야기하고 있습니다. F # 대 Haskell에서 순수 코드의 "최적화"에 대해 이야기하고 있습니다.

53

큰 차이점 :

  • 플랫폼
  • 개체 방향
  • 게으름

유사점이 차이점보다 더 중요합니다. 기본적으로 이미 .NET을 사용하고 있다면 F #을 사용해야하고 그렇지 않으면 Haskell을 사용해야합니다. 또한 OO와 게으름은 F #이 이미 알고있는 것 (아마도)에 더 가깝다는 것을 의미하므로 배우기가 더 쉬울 것입니다.

플랫폼 : Haskell에는 자체 런타임이 있으며 F #은 .NET을 사용합니다. 성능 차이가 무엇인지 모르겠지만 최적화 전에 평균 코드가 거의 동일하다고 생각합니다. F #은 .NET 라이브러리가 필요한 경우 이점이 있습니다.

개체 방향 : F #에는 OO가 있으며 코드가 OO가 아닌 경우에도 .NET 클래스를 사용하기 쉽도록 매우주의합니다. Haskell에는 이상한 방식으로 OO와 같은 것을 할 수있는 타입 클래스가 있습니다. Common Lisp 제네릭 함수와 교차하는 Ruby 믹스 인과 같습니다. Java / C # 인터페이스와 비슷합니다.

게으름 : Haskell은 게으르고 F #은 그렇지 않습니다. 게으름은 멋진 트릭을 가능하게하고 느리게 보이는 일부를 실제로 빠르게 실행하도록합니다. 하지만 내 코드가 얼마나 빨리 실행 될지 추측하기가 훨씬 더 어렵다는 것을 알았습니다. 두 언어 모두 다른 모델을 사용할 수있게 해주므로 코드에서 명시 적이어야합니다.

사소한 차이점 :

  • 구문 : Haskell은 제 생각에 약간 더 좋은 구문을 가지고 있습니다. 좀 더 간결하고 규칙적이며 별도의 줄에 유형을 선언하는 것을 좋아합니다. YMMV.
  • 도구 : 그런 종류의 것을 좋아한다면 F #은 뛰어난 Visual Studio 통합 기능을 제공합니다. Haskell에는 이전 Visual Studio 플러그인 도 있지만 베타에서 나온 적이 없다고 생각합니다. Haskell에는 간단한 emacs 모드가 있으며 아마도 OCaml의 tuareg-mode 를 사용하여 F #을 편집 할 수 있습니다 .
  • 부작용 : 두 언어 모두 변수를 변경할 때 매우 분명 합니다. 그러나 Haskell의 컴파일러는 또한 부작용을 사용할 때마다 표시하도록 강제합니다. 실질적인 차이점은 부작용이있는 라이브러리를 사용할 때도 더 많이 인식해야한다는 것입니다.

1
성능을 참조하십시오 . 방법을 잘 모르 합법적 그것이
nawfal

35

F #은 ML 제품군 언어의 일부이며 OCaml과 매우 유사합니다. Haskell과 OCaml차이점 에 대한이 토론을 읽고 싶을 것 입니다.


6
이 링크가 질문에 답할 수 있지만 여기에 답변의 필수 부분을 포함하고 참조 용 링크를 제공하는 것이 좋습니다. 링크 된 페이지가 변경되면 링크 전용 답변이 무효화 될 수 있습니다. - 리뷰에서
mirabilos dec

33

아마도 순결의 결과 일 수 있지만 언급하지 않은 주요 차이점은 모나드가 널리 사용된다는 것입니다. 자주 지적했듯이 모나드는 대부분의 언어로 빌드 할 수 있지만 라이브러리 전체에서 널리 사용되고 사용자가 직접 사용하면 삶이 크게 바뀝니다.

모나드는 다른 언어에서 훨씬 더 제한된 방식으로 보이는 것을 제공합니다 : 흐름 제어의 추상화. 그것들은 모든 종류의 일을하는 믿을 수 없을 정도로 유용하고 우아한 방법입니다. 그리고 Haskell의 1 년은 제가 프로그램하는 방식을 완전히 바 꾸었습니다. 수년 전에 명령형에서 OO 프로그래밍으로 옮겨가는 것과 같은 방식으로, 또는 훨씬 나중에, 고차 함수를 사용했습니다.

안타깝게도 이와 같은 공간에서는 차이점이 무엇인지 알 수 있도록 충분한 이해를 제공 할 방법이 없습니다. 사실 아무리 글을 써도 그렇게 할 수는 없습니다. 실제 이해를 얻으려면 코드를 배우고 작성하는 데 충분한 시간을 투자하면됩니다.

또한 라이브러리가 분명히 OO 관점에서 설계 되었기 때문에 .NET 플랫폼 / 라이브러리와 인터페이스 할 때 F #이 기능적 프로그래밍 관점에서 약간 덜 기능적이거나 더 어색해질 수 있습니다.

따라서 당신의 결정을 다음과 같이 고려할 수 있습니다. 빠르고 상대적으로 작은 개선점을 얻기 위해 이러한 언어 중 하나를 사용해 보거나 더 많은 시간을 투자하고 더 큰 것을 위해 즉각적인 혜택을 덜받을 의향이 있습니까? 장기. (또는 적어도 더 큰 것을 얻지 못하면 다른 것으로 빠르게 전환 할 수있는 쉬운 능력?) 전자 인 경우 F #을 선택하고 후자 인 경우 Haskell을 선택합니다.

기타 관련없는 몇 가지 사항 :

Haskell은 약간 더 멋진 구문을 가지고 있습니다. Haskell의 디자이너는 ML을 아주 잘 알고 있었기 때문에 놀랄 일이 아닙니다. 그러나 F #의 '가벼운'구문은 ML 구문을 개선하는 데 큰 도움이되므로 큰 차이가 없습니다.

플랫폼 측면에서 F #은 물론 .NET입니다. Mono에서 얼마나 잘 작동하는지 모르겠습니다. GHC는 자체 런타임을 사용하여 기계어 코드로 컴파일되며 Windows와 Unix 모두에서 잘 작동합니다. 이는 C ++와 같은 방식으로 .NET과 비교됩니다. 이는 특히 속도와 낮은 수준의 머신 액세스 측면에서 일부 상황에서 이점이 될 수 있습니다. (예를 들어, Haskell / GHC로 DDE 서버를 작성하는 데 문제가 없었습니다. 어떤 .NET 언어로도 그렇게 할 수 있다고 생각하지 않습니다. MS는 확실히 그렇게하는 것을 원하지 않습니다.)


2

글쎄요, 하나의 주요 이점은 F #이 .NET 플랫폼에 대해 컴파일되어 Windows에 쉽게 배포 할 수 있다는 것입니다. 웹 응용 프로그램을 빌드하기 위해 ASP.NET과 결합 된 F #을 사용하여 설명하는 예제를 보았습니다 ;-)

반면에 Haskell은 훨씬 더 오래 있었기 때문에 그 언어에 대한 진정한 전문가 그룹이 훨씬 더 크다고 생각합니다.

F #의 경우 지금까지 하나의 실제 구현 만 보았는데, 이는 개념 OS의 특이점 증명입니다. 저는 Haskell의 실제 구현을 더 많이 보았습니다.


4
F #은 이미 Haskell이 성공 사례 (Darcs)에 가장 가까운 것보다 더 큰 몇 가지 주요 성공 사례 (Halo 3, AdCenter, F # for Visualization)를 가지고 있습니다.
JD

물론 이것에 대한 단점이 있음을 지적 할 가치가 있습니다. (CLR 제한)
MasterMastic 2014
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.