F # OCaml'de değişiklikler [kapalı]


126

F #, OCaml'den türetilmiştir, ancak hangi ana öğeler eksik veya eklenmiştir? Özellikle OCaml öğrenmek için mevcut olan kaynakların F # öğrenmek isteyen biri için de yararlı olup olmadığını merak ediyorum.


3
Bir OCaml geliştiricisinin bakış açısından başka bir karşılaştırma , bu yüzden oldukça önyargılı ama yine de kullanışlıdır.
Mauricio Scheffer

8
Dikkat: Bu sorunun kaderiyle ilgileniyorsanız, lütfen Meta Stack Overflow'daki tartışmaya katılın veya sohbette tartışın - buradaki yorumlar olağanüstü verimsizdi, bu yüzden onları kaldırdım.
Shog9

1
@MauricioScheffer Kırık bağlantı!
JD

2
@JonHarrop Sanırım bu bağlantı güncellenmiş bağlantı olabilir. (Keiko Nakata)
Bart

Yanıtlar:


89

Temel farklar, F # 'nın şunları desteklememesidir:

  • funktorlar
  • OCaml tarzı nesneler
  • polimorfik varyantlar
  • camlp4 / 5 ön işlemcisi veya uzatma noktaları (ppx)

Ayrıca F #, etiketli ve isteğe bağlı parametreler için farklı bir sözdizimine sahiptir.

Teorik olarak, bu özellikleri kullanmayan OCaml programları F # ile derlenebilir. OCaml'i öğrenmek F # için son derece makul bir giriştir (ve bunun tersi de tahmin ediyorum).

Farklılıkların tam listesi burada (not: archive.org ölü bağlantının değiştirilmesi).


3
F # için camlp4 eşdeğeri var mı?
nlucaroni

Öyle düşünmeyin. Ama programınızı muhtemelen camlp4 ve F # derleyicisine aktarabilirsiniz. (Tavsiye etmem.)
Chris Conway

6
F #, adlandırılmış ve isteğe bağlı bağımsız değişkenlere sahiptir, ancak farklı bir sözdizimi ve anlambilim kullanır. Camlp4'ü F # ile kullanırken sorun yaşarsınız çünkü F # neredeyse her zaman girintiye duyarlıdır, bu nedenle yeni bir lexer'a ihtiyaç duyacaktır ve lexers hakkındaki Camlp4 belgeleri neredeyse iki yıldır yazılmamıştır.
JD

4
Ve şimdi bağlantı öldü. Sanırım bu muhtemelen iyidir. Eminim F # '08'den beri geliştirilmiştir.

1
Bir yerlerde Microsoft'un camlp4 benzeri işlevselliği F #'a eklemek istemediğini duydum çünkü bu tür bir işlevselliğin insanları Microsoft Visual Studio dışındaki geliştirme ortamlarını kullanmaya teşvik edebileceğinden endişeleniyorlardı.
chrismamo1

118

Bu soru bir süredir cevaplandı, ancak cevapların çoğunun F # 'da hangi OCaml özelliklerinin eksik olduğunu söylediğine oldukça şaşırdım - bu, mevcut OCaml programlarını F #' a taşımak isteyip istemediğinizi bilmek kesinlikle iyidir (muhtemelen atıfta bulunulan makalelerin çoğunun motivasyonu). Ancak, F # 'ı farklı bir dil yapan birçok özellik vardır (sadece .NET için OCaml'in sınırlı bir sürümü değil!) İşte F #' da eklenen birkaç şey:

  • Sayısal hesaplamalarla ilgili kodu yazıp kontrol etmenizi sağlayan ölçü birimleri
  • Alıntıları kullanarak meta programlama (bu, LINQ'nun F # dilinde kullanılmasını mümkün kılar ve ayrıca WebSharper platformu gibi projeleri vaat etmek için gereklidir)
  • İşlevsel veri türleri için soyutlamalar oluşturmak için etkin kalıplar (ve genellikle daha karmaşık kalıp eşleştirme uygulamaları için çok kullanışlı özellik)
  • Eşzamansız iş akışlarının arkasındaki bir dil özelliği olan hesaplama ifadeleri (eşzamansız G / Ç / web hizmeti / GUI programlama için bir kitaplık)
  • .NET platformuyla tam olarak birlikte çalışmayı mümkün kılan .NET uyumlu nesne sistemi (OCaml ayrıca nesneler için bir desteğe sahiptir ancak farklıdır - elbette her iki sistemde de bazı faydalar vardır).
  • Aşırı yüklenmiş operatörler - Bildiğim kadarıyla, OCaml'de aşırı yüklenmiş operatörler yoktur - F # 'da +tüm sayısal tipler ve onu destekleyen tipler için kullanabilirsiniz.

Ve dürüst olmak gerekirse, Visual Studio IDE'den bahsetmeye değer olduğunu düşünüyorum. Bu, dilin bir parçası değildir, ancak kullanıcı deneyimini gerçekten iyileştirir (Visual Studio'da IntelliSense desteği gerçekten iyidir!)

Listeye bakarsanız, F # 'ın popülaritesine büyük ölçüde katkıda bulunan pek çok şey vardır, bu yüzden "işlevsiz OCaml" den çok daha fazlasıdır. F # kesinlikle OCaml'ye dayanır (ve Haskell gibi diğer dillerden fikir alır) ve onlarla birçok yön paylaşır, ancak başka pek çok şey de vardır. Sanırım zaman uyumsuz iş akışları, .NET tarzı OO ve meta programlama gibi şeyler olmadan, Microsoft Geliştirici Bölümü Visual Studio 2010'a asla F # eklemeyecekti.


18
Vay! OCaml, özellikle metaprogramlama için üretilmiştir, bu bağlamda F # ve .NET'ten büyük ölçüde üstündür. Camlp4, F #'lardan çok daha güçlü bir teklif sistemidir. OCaml'ın sözcükleri ve ayrıştırıcıları, .NET için mevcut olan her şeyden çok daha iyidir. Ayrıca, aktif kalıpları ve hesaplama ifadelerini uygulayan Camlp4 makroları da mevcuttur. OCaml ayrıca, Visual Studio'nun F # için sağladığı faydaların aynısını sağlayan IDE'lere de sahiptir.
JD

4
F # alıntıları, Camlp4'te mevcut olandan tamamen farklı bir hedefe sahiptir (bir yana, bu OCaml dili değildir - bunun üzerine bir sistemdir), bu yüzden onları karşılaştırmak adil değildir. Camlp4'ün varlığı kesinlikle OCaml'ın bir avantajıdır, ancak alıntılarla (WebSharper, GPU'da F # çalıştırma gibi şeylere izin veren) hiçbir ilgisi yoktur
Tomas Petricek

12
@Tomas: Camlp4, ikili düzeyde OCaml ile entegre edildiğinde ve Camlp4 makroları çalışan bir OCaml REPL'de anında tanımlanıp kullanılabildiğinde, Camlp4 "ün" OCaml "üzerine bir sistem olduğu iddianızı nasıl uzlaştırırsınız? Camlp4'ün "alıntılarla ilgisi olmadığı" iddianız ile Camlp4'ün bir teklif mekanizması sağlaması gerçeğini nasıl bağdaştırıyorsunuz? SkyDeck'in ocamljs aracı, 2007'den beri Camlp4 kullanılarak alıntılanan OCaml kodunu Javascript'e derlerken Camlp4'ün Websharper'ın beğenilerini kolaylaştıramayacağı şeklindeki imanızı nasıl uzlaştırırsınız?
JD

6
@Tomas: F #, gibi <@ a @>tip tanımları bir yana, bağlı olmayan değişkenler içeren ifadeleri bile alıntılayamaz <@ type t = int @>ve Camlp4'ün yaptığı gibi gelişigüzel gramerlerle çok daha az genişletilebilir lexer ve ayrıştırıcıları işleyemez. İyi bir makro sistem eksikliği bir eksikliktir, ancak IMHO, F # için herhangi bir düzgün sözcük ve ayrıştırıcı eksikliği çok daha ciddi bir engeldir. Aslında geliştiricilere, OCaml kullanarak kendi sözcüklerini ve ayrıştırıcılarını oluşturmalarını, kendilerini F #'ın desteklediği alt kümeyle sınırlamalarını ve OCaml'ın üstün araç desteğinden yararlanmak için F #'a geri aktarmalarını tavsiye ediyorum!
JD

8
@Erik: "Çoğu insan F #'da neyin eksik olduğuna odaklanıyor, ancak ben de OCaml'de neyin eksik olduğunu görmek istedim". Etkin kalıpların, meta programlamanın, hesaplama ifadelerinin ve eşzamansız iş akışlarının OCaml'de F #'a dönüştürülmeden önce mevcut olduğunu unutmayın.
JD

16

F # 'ı her zaman OCaml'ın kuzeni olarak tanımlarım çünkü OCaml, F #' ın sahip olmadığı ve asla elde edemeyeceği birçok özelliğe sahiptir. F #, önceki CAML diliyle daha yakından ilgilidir. Özellikle, F #, soyutlama için çok sınırlı desteğe sahiptir ve yapısal tipleme (OCaml'in nesneleri ve polimorfik varyantları gibi ) için hiçbir desteği yoktur .

Bazı yanıt verenlerin yazdıklarının aksine, F # etiketli ("adlandırılmış") ve isteğe bağlı argümanlar için (sınırlı) desteğe sahiptir.

Ancak, bunların hepsi gelişmiş özelliklerdir ve OCaml ile ilgili kaynakları kullanarak küçük ölçekli OCaml tarzı işlevsel programlamanın arkasındaki temel fikirleri kesinlikle öğrenmeye başlayabilirsiniz. Keşfedeceğiniz ilk büyük fark, OCaml ve F #'da tamamen farklı yollarla çözülen kapsülleme ve soyutlama gibi daha büyük ölçekli problemlerdir. F # ile bunu nasıl yapacağınızı öğrenmek istiyorsanız, mevcut tek literatür tamamen işlevsel veri yapıları hakkındaki bu makaledir .

Ayrıca, OCaml'ın harika modül sisteminin, kod türleri üzerinde (veri yapıları gibi) parametrelendirmeyi kolaylaştırdığını, ancak OOP alternatiflerinin sadece iğrenç değil, .NET üzerinde neredeyse tamamen kullanılmadığını da keşfettim. Dahası, zarif bir şekilde parametrelendirilmiş veri yapıları yazmaya çalışırken, F # derleyicide düzinelerce hataya çarptım çünkü daha önce kimse bunu yapmaya kalkışmadı. F # stdlib bazı güzel veri yapısı uygulamaları içerir, ancak hemen hemen hiç yeniden kullanım yoktur, yani bir kes ve yapıştır işidir.


28
Tüm bağlantılar ücretli abonelik gerektirir.

2
@ Jon Harrop'un yazdığı şeyler için utanmaz bir eklenti gibi görünecekler mi (her seferinde yazar olarak listeleniyor)
symbiont

@symbiont Evet, biraz spam olduğunu biliyoruz. Ücretsiz olan bazı ek bilgilerle bağlantı kurarsanız iyi olur. Ama cevap bağlantılar olmadan gayet iyi, işte buradasın.

@Bazı ek bilgileri kendiniz bağlarsanız iyi olur
symbiont

@symbiont "sen" dediğimde seni değil, Jon'u kastettim. Okumak tuhaf geliyor. Jon'un bir ara yorumu silip silmediğinden emin değilim. Her neyse, işte

9

F # ve OCaml, diğer tuhaf hayvanların bütün bir geçişini içeren ML ailesindeki taksonomik sınıflardır. F #, OCaml'den daha yenidir ve henüz functors [modül fonksiyonları -> modül] veya satır türleri [nesne sınıfları ve polimorfik değişkenler] içermemektedir. Aralarında, bu iki basitleştirme muhtemelen .Net platformunda gelişen biri için öğrenme eğrisini kolaylaştırır. Ne yazık ki, bu iki dil özelliği OCaml'de oldukça güçlüdür, bu nedenle F # için nasıl kod yazılacağına dair fikir edinmek için OCaml literatürünü okumak, muhtemelen her ikisinin de mevcut olduğu C # için mükemmel bir alternatif olduğu zaman, ikincisi için erken bir hayal kırıklığına yol açacaktır.


2

F #, doğrudan OCaml sözdizimini destekler. % 100 uyumlu olmayabilir, ancak oldukça yakın olduğunu düşünüyorum.

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

İşte bir farklılık listesi (ne kadar güncel olduğundan emin değilim)

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


1
"F #, OCaml sözdizimini doğrudan destekler.% 100 uyumlu olmayabilir, ancak oldukça yakın olduğunu düşünüyorum". IME the F # derleyicisinin OCaml uyumluluğu desteği çok bozuk. Bu, mevcut OCaml kod tabanlarını F # 'ye taşımayı zorlaştırabilir çünkü F # derleyicisi dahili olarak geçerli kodda ölür.
JD

Tüm bağlantılar kesildi.
Wingjam
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.