F # 과 Haskell 을 비교하기 위해 인터넷에서 검색 했지만 실제로 결정적인 것을 찾지 못했습니다. 주요 차이점은 무엇이며 왜 다른 하나를 선택해야합니까?
답변:
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
큰 차이점 :
유사점이 차이점보다 더 중요합니다. 기본적으로 이미 .NET을 사용하고 있다면 F #을 사용해야하고 그렇지 않으면 Haskell을 사용해야합니다. 또한 OO와 게으름은 F #이 이미 알고있는 것 (아마도)에 더 가깝다는 것을 의미하므로 배우기가 더 쉬울 것입니다.
플랫폼 : Haskell에는 자체 런타임이 있으며 F #은 .NET을 사용합니다. 성능 차이가 무엇인지 모르겠지만 최적화 전에 평균 코드가 거의 동일하다고 생각합니다. F #은 .NET 라이브러리가 필요한 경우 이점이 있습니다.
개체 방향 : F #에는 OO가 있으며 코드가 OO가 아닌 경우에도 .NET 클래스를 사용하기 쉽도록 매우주의합니다. Haskell에는 이상한 방식으로 OO와 같은 것을 할 수있는 타입 클래스가 있습니다. Common Lisp 제네릭 함수와 교차하는 Ruby 믹스 인과 같습니다. Java / C # 인터페이스와 비슷합니다.
게으름 : Haskell은 게으르고 F #은 그렇지 않습니다. 게으름은 멋진 트릭을 가능하게하고 느리게 보이는 일부를 실제로 빠르게 실행하도록합니다. 하지만 내 코드가 얼마나 빨리 실행 될지 추측하기가 훨씬 더 어렵다는 것을 알았습니다. 두 언어 모두 다른 모델을 사용할 수있게 해주므로 코드에서 명시 적이어야합니다.
사소한 차이점 :
F #은 ML 제품군 언어의 일부이며 OCaml과 매우 유사합니다. Haskell과 OCaml 의 차이점 에 대한이 토론을 읽고 싶을 것 입니다.
아마도 순결의 결과 일 수 있지만 언급하지 않은 주요 차이점은 모나드가 널리 사용된다는 것입니다. 자주 지적했듯이 모나드는 대부분의 언어로 빌드 할 수 있지만 라이브러리 전체에서 널리 사용되고 사용자가 직접 사용하면 삶이 크게 바뀝니다.
모나드는 다른 언어에서 훨씬 더 제한된 방식으로 보이는 것을 제공합니다 : 흐름 제어의 추상화. 그것들은 모든 종류의 일을하는 믿을 수 없을 정도로 유용하고 우아한 방법입니다. 그리고 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는 확실히 그렇게하는 것을 원하지 않습니다.)
글쎄요, 하나의 주요 이점은 F #이 .NET 플랫폼에 대해 컴파일되어 Windows에 쉽게 배포 할 수 있다는 것입니다. 웹 응용 프로그램을 빌드하기 위해 ASP.NET과 결합 된 F #을 사용하여 설명하는 예제를 보았습니다 ;-)
반면에 Haskell은 훨씬 더 오래 있었기 때문에 그 언어에 대한 진정한 전문가 그룹이 훨씬 더 크다고 생각합니다.
F #의 경우 지금까지 하나의 실제 구현 만 보았는데, 이는 개념 OS의 특이점 증명입니다. 저는 Haskell의 실제 구현을 더 많이 보았습니다.