F #이 OCaml로 변경됨 [닫힘]


126

F #은 OCaml에서 파생되었지만 누락되거나 추가 된 주요 항목은 무엇입니까? 특히 OCaml 학습에 사용할 수있는 리소스가 F #을 배우려는 사람에게도 유용한 지 궁금합니다.


3
OCaml 개발자의 관점에서 또 다른 비교 는 매우 편향되어 있지만 그럼에도 유용합니다.
Mauricio Scheffer

8
주의 : 이 질문의 운명에 관심이 있다면 Meta Stack Overflow 에 대한 토론에 참여 하거나 채팅 에서 토론 하십시오. 여기의 의견은 비생산적이므로 제거했습니다.
Shog9

1
@MauricioScheffer 끊어진 링크!
JD

2
@ JonHarrop 이 링크 가 업데이트 된 것 같습니다. (나카타 케이코)
Bart

답변:


89

주요 차이점은 F #이 지원하지 않는다는 것입니다.

  • 펑터
  • OCaml 스타일 객체
  • 다형성 변이체
  • camlp4 / 5 전 처리기 또는 확장 점 (ppx)

또한 F #에는 레이블이 지정된 매개 변수 및 선택적 매개 변수에 대한 다른 구문이 있습니다.

이론적으로 이러한 기능을 사용하지 않는 OCaml 프로그램은 F #으로 컴파일 할 수 있습니다. Learning OCaml은 F #을 완벽하게 합리적으로 소개합니다 (그리고 그 반대도 마찬가지입니다).

차이점의 전체 목록은 여기 (참고 : dead.link의 archive.org 대체)입니다.


3
F #에 해당하는 camlp4가 있습니까?
nlucaroni

그렇게 생각하지 마십시오. 그러나 camlp4를 통해 F # 컴파일러로 프로그램을 파이프 할 수 있습니다. (권장하지 않습니다.)
Chris Conway

6
F #에는 명명 된 인수와 선택적 인수가 있지만 다른 구문과 의미를 사용합니다. F #은 거의 항상 들여 쓰기에 민감하므로 새 렉서가 필요하고 렉서에 대한 Camlp4 설명서는 거의 2 년 동안 기록되지 않은 상태로 유지되므로 F #에서 Camlp4를 사용하는 데 문제가 있습니다.
JD

4
그리고 지금 연결이 끊어졌습니다. 아마 그게 좋을 것 같아요. 08 년 이후로 F #이 향상되었다고 확신합니다.

1
Microsoft가 F #에 camlp4와 같은 기능을 추가하고 싶지 않다는 소식을 들었습니다. 이러한 기능으로 인해 사람들이 Microsoft Visual Studio 이외의 개발 환경을 사용하기 시작할 수 있다고 걱정했기 때문입니다.
chrismamo1

118

이 질문은 한동안 답변을 받았지만 대부분의 답변이 F #에서 누락 된 OCaml 기능에 대해 말하고 있다는 사실에 상당히 놀랐습니다. 기존 OCaml 프로그램을 F #으로 이식하려는 경우 확실히 알 수 있습니다. 참고 문헌 대부분의 동기). 그러나 F #을 다른 언어로 만드는 많은 기능이 있습니다 (.NET 용 OCaml의 제한된 버전 만이 아닙니다!) F #에 추가 된 몇 가지 사항은 다음과 같습니다.

  • 숫자 계산을 처리하는 코드를 유형 검사 할 수 있는 측정 단위
  • 따옴표를 사용한 메타 프로그래밍 (F #에서 LINQ를 사용할 수 있으며 WebSharper 플랫폼과 같은 프로젝트를 승인하는 데 필수적 임)
  • 기능적 데이터 유형에 대한 추상화를 작성하기위한 활성 패턴 (보다 복잡한 패턴 일치 애플리케이션에 일반적으로 매우 유용한 기능)
  • 비동기 워크 플로우 ( 언어 화 I / O / 웹 서비스 / GUI 프로그래밍을위한 라이브러리 )의 언어 기능인 계산식
  • .NET 플랫폼과 완벽하게 상호 운용 될 수있는 .NET 호환 객체 시스템 (OCaml은 객체를 지원하지만 서로 다릅니다. 물론 두 시스템 모두에 이점이 있습니다).
  • 과부하 연산자 -내가 아는 한 OCaml에는 과부하 연산자가 없습니다. F # +에서는 모든 숫자 유형과이를 지원하는 유형에 모두 사용할 수 있습니다 .

그리고 솔직히 Visual Studio IDE에 대해서도 언급 할 가치가 있다고 생각합니다. 이것은 언어의 일부는 아니지만 사용자 경험을 향상시킵니다 (Visual Studio의 IntelliSense 지원은 정말 좋습니다!)

이 목록을 보면 F #의 인기에 크게 기여한 것이 많기 때문에 "펑터가없는 Ocaml"이상의 것입니다. F #은 분명히 OCaml을 기반으로하고 (하스켈과 같은 다른 언어의 아이디어를 취함) 그들과 많은 측면을 공유하지만 다른 것들도 많이 있습니다. 비동기 워크 플로, .NET 스타일 OO 및 메타 프로그래밍과 같은 것이 없으면 Microsoft Developer Division은 Visual Studio 2010에서 F #을 절대 포함하지 않을 것입니다.


18
우와! OCaml은 메타 프로그래밍을 위해 특별히 개발되었으며, 그 맥락에서 F # 및 .NET보다 훨씬 우수합니다. Camlp4는 F #보다 훨씬 강력한 견적 시스템입니다. OCaml의 어휘 분석기와 파서는 .NET에 사용 가능한 것보다 훨씬 좋습니다. 또한 활성 패턴과 계산 식을 구현하는 Camlp4 매크로를 사용할 수 있습니다. 또한 OCaml에는 Visual Studio가 F #에서하는 것과 동일한 이점을 제공하는 IDE가 있습니다.
JD

4
F # 인용문은 Camlp4에서 사용 가능한 것과 완전히 다른 목표를 가지고 있지만 (이것은 OCaml 언어가 아니며 그 위에있는 시스템 임), 비교하는 것은 불공평합니다. Camlp4의 존재는 확실히 OCaml의 장점이지만 따옴표와는 아무런 관련이 없습니다 (WebSharper, GPU에서 F # 실행 등을 허용합니다)
Tomas Petricek

12
@Tomas : Camlp4가 바이너리 수준에서 OCaml과 통합되어 있고 Camlp4 매크로가 실행중인 OCaml REPL에서 즉석에서 정의되고 사용될 수있을 때 Camlp4가 "OCaml 위에있는 시스템"이라는 주장을 어떻게 조정합니까? Camlp4가 견적 메커니즘을 제공한다는 사실과 함께 Camlp4가 "견적과 관련이 없다"는 주장을 어떻게 조정합니까? SkyDeck의 ocamljs 도구가 2007 년 이후 Camlp4를 사용하여 인용 된 OCaml 코드를 Javascript로 컴파일 할 때 Camlp4가 Websharper와 같은 기능을 활용할 수 없다는 의미를 어떻게 조정합니까?
JD

6
@Tomas : F #은 같은 <@ a @>타입 정의는 물론, 언 바운드 변수를 가진 표현식을 인용 <@ type t = int @>할 수 없으며, Camlp4와 같이 확장 성이 낮은 어휘 분석기와 파서보다 임의의 문법을 처리 할 수 ​​없습니다. 적절한 매크로 시스템의 부족은 하나의 결함이지만 IMHO는 F #에 대한 적절한 어휘 분석기와 파서가 없다는 것이 훨씬 더 심각한 장애입니다. 실제로 개발자는 OCaml을 사용하여 어휘 분석기와 파서를 작성하여 F #이 지원하는 서브 세트로 제한하고 OCaml의 우수한 도구 지원을 활용하기 위해 F #으로 다시 포팅하도록 권고합니다!
JD

8
@Erik : "대부분의 사람들은 F #에서 누락 된 부분에 집중하지만 OCaml에서 누락 된 부분도보고 싶었습니다." 활성 패턴, 메타 프로그래밍, 계산 표현식 및 비동기 워크 플로우는 F #으로 만들기 전에 OCaml에서 사용할 수있었습니다.
JD

16

OCaml에는 F #에없는 기능이 많고 얻을 수없는 기능이 많으므로 항상 F #을 OCaml의 사촌으로 설명합니다. F #은 이전 CAML 언어와 더 밀접한 관련이 있습니다. 특히 F #은 추상화에 대한 지원이 매우 제한적이며 OCaml의 객체다형성 변형 과 같은 구조적 타이핑은 전혀 지원하지 않습니다 .

일부 응답자가 작성한 내용과 달리 F #은 레이블이 지정된 ( "named") 및 선택적 인수를 제한적으로 지원합니다.

그러나 이러한 기능은 모두 고급 기능이므로 OCaml 관련 리소스를 사용하여 소규모 OCaml 스타일의 기능 프로그래밍의 기본 개념을 익히기 시작할 수 있습니다. 발견 할 첫 번째 주요 차이점은 캡슐화 및 추상화와 같은 대규모 문제로, OCaml과 F #에서 완전히 다른 방식으로 해결됩니다. F # 에서이 작업을 수행하는 방법을 배우려면 순전히 기능적인 데이터 구조에 대한이 기사 만 사용할 수 있습니다 .

또한 OCaml의 훌륭한 모듈 시스템을 사용하면 데이터 구조와 같은 유형의 코드를 쉽게 매개 변수화 할 수 있지만 OOP 대안은 끔찍할뿐만 아니라 .NET에서 거의 완전히 사용되지 않습니다. 또한, 매개 변수가 매끄럽게 매개 변수화 된 데이터 구조를 작성하려고 할 때 F # 컴파일러에서 수십 개의 버그가 발생했습니다. F # stdlib에는 멋진 데이터 구조 구현이 포함되어 있지만 사실상 재사용은 없습니다. 즉, 붙여 넣기 작업입니다.


28
모든 링크는 유료 가입이 필요합니다.

2
@ 그들은 존 하롭이 직접 쓴 것들에 대한 뻔뻔한 플러그 인 것처럼 보일 것입니다 (그는 매번 저자로 등재 됨)
symbiont

@ symbiont 그래, 우리는 약간의 스팸성을 알고 있습니다. 무료 인 추가 정보에 연결하면 좋을 것입니다. 그러나 링크가 없으면 대답은 괜찮습니다.

@ 추가 정보를 직접 연결하면 좋을 것입니다
symbiont

@symbiont 나는 "당신"이라고 말할 때 당신이 아닌 존을 의미했습니다. 이상하게 들립니다. Jon이 삽입 광고 댓글을 삭제했는지 확실하지 않습니다. 여하튼, 당신은 간다 : Meta Stack Exchange

9

F #과 OCaml은 ML 언어의 분류 체계적으로 분류되며 다른 이상한 동물도 포함됩니다. F #은 OCaml보다 새로운 기능이며 아직 함수 (모듈의 기능-> 모듈) 나 행 유형 (개체 클래스 및 다형성 변형)이 없습니다. 그들 사이에서,이 두 가지 단순화는 아마도 .Net 플랫폼에서 개발하는 사람이 학습 곡선을 더 쉽게 만들어 줄 것입니다. 안타깝게도이 두 언어 기능은 OCaml에서 매우 강력하므로 F #을 코딩하는 방법에 대한 통찰력을 얻기 위해 OCaml 문헌을 읽으면 C #을 대체 할 수있는 C #의 훌륭한 대안이 될 수 있습니다.


2

F #은 OCaml 구문을 직접 지원합니다. 100 % 호환되지는 않지만 꽤 가깝습니다.

http://plus.kaist.ac.kr/~shoh/fsharp/html/index.html

차이점 목록은 다음과 같습니다 (최신 상태인지 확실하지 않음).

http://plus.kaist.ac.kr/~shoh/fsharp/html/fsharp-vs-ocaml.html


1
"F #은 OCaml 구문을 직접 지원합니다. 100 % 호환되지는 않지만 꽤 가깝다고 생각합니다." OCaml 호환성에 대한 F # 컴파일러의 지원 인 IME는 매우 버그가 있습니다. F # 컴파일러는 유효한 코드에서 내부적으로 죽기 때문에 기존 OCaml 코드베이스를 F #으로 이식하기가 어려울 수 있습니다.
JD

모든 링크가 죽었습니다.
Wingjam
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.