Neden F#?
(batsov.com)- F#, .NET’i hedefleyen ML ailesinden fonksiyonel bir dil ve Microsoft tarafından geliştirildi. Ağırlıklı olarak nesne yönelimli olan C# ile karşılaştırıldığında, F# fonksiyonel programlama paradigmasına odaklanır
- Bu yazı F#’ın dil özelliklerini, ekosistemini, dokümantasyon durumunu, geliştirme araçlarını, kullanım örneklerini, topluluk durumunu ve F# vs. OCaml karşılaştırmasını derliyor
F# nedir?
- F#, kısa, sağlam ve performanslı kod yazmak için tasarlanmış genel amaçlı bir programlama dilidir
- Karmaşık sözdizimiyle uğraşmak yerine, doğrudan problem çözmeye odaklanabilmeniz için tasarlanmıştır
- Açık kaynaklıdır, çapraz platformdur ve .NET ile yüksek uyumluluğa sahiptir
-
Özellikler
- Hafif sözdizimi ve varsayılan değişmezlik
- Tip çıkarımı ve genelleştirme
- Birinci sınıf fonksiyonlar, güçlü veri tipleri, pattern matching
- Eşzamansız programlama (
Async) desteği - Ünlü pipeline operatörünün (
|>) çıkış noktası olan dildir
-
Basit örnek kod
open System let names = [ "Peter"; "Julia"; "Xi" ] let getGreeting name = $"Hello, {name}" names |> List.map getGreeting |> List.iter (printfn "%s") - F#, 2005’te Microsoft Research’te Don Syme tarafından geliştirilen bir dil olarak ortaya çıktı
- OCaml’ı .NET platformuna taşıma araştırma projesi (Caml.NET) olarak başladı
- Ardından 2010’dan itibaren resmi bir ürün haline geldi ve 2024’te F# 9.0 yayımlandı
- 2025 itibarıyla 20. yılına ulaşmış olgun bir dil konumunda
- F#’ı denemeye iten başlıca nedenler
- .NET’in açık kaynak ve çapraz platform yönünde evrimini görmek
- OCaml karşısındaki artılarını ve eksilerini kıyaslamak
- Rider, Ionide gibi araçlar hakkındaki olumlu değerlendirmeler
- Basitçe yeni bir dili keşfetme merakı
Bir dil olarak F#
- F#, ML ailesinden fonksiyonel bir dildir ve OCaml kullanıcılarına tanıdık gelecek bir sözdizimine sahiptir
- Haskell veya Lisp deneyimi olan geliştiriciler de kolayca uyum sağlayabilir
- Boşluk tabanlı sözdizimi yapısı kullanır; Python’daki gibi girinti sözdizimsel olarak önemlidir
- Yeni başlayanların da temel sözdizimini hızlıca öğrenebilmesi için tasarlanmıştır
-
Dil özelliklerinin özeti
- Fonksiyon tanımı ve uygulaması kısa ve doğal biçimde ifade edilebilir
- Koşullar, döngüler, tuple’lar, liste işlemleri fonksiyonel tarzda temiz bir şekilde kullanılabilir
- Record’lar, ayrımlı birleşimler (Discriminated Union), pattern matching sayesinde karmaşık veri yapıları kısa biçimde ele alınabilir
- Pipeline operatörü (
|>) ile veri akışı, fonksiyonların birbirine bağlanması gibi görsel olarak net bir yapıda kurulabilir - F#, ad-hoc script yazımı için çok uygundur;
.fsxdosyaları yazılıpdotnet fsiile doğrudan çalıştırılabilir - REPL ortamı da sunar; bu da keşif odaklı programlama için avantaj sağlar
-
Kullanıcı dostu sözdizimi
- Tek satır ve çok satırlı yorumlar,
mutabledeğişkenler, liste slice’ları gibi pratik sözdizimsel özellikler içerir - C# ile yüksek uyumluluğu sayesinde .NET API’lerini kolayca kullanabilirsiniz
- Farklı tipler için operator overloading de doğal biçimde desteklenir
printfn, farklı tipleri kolayca yazdırabildiği için debug ve logging açısından kullanışlıdır
- Tek satır ve çok satırlı yorumlar,
-
Eşzamansız programlamanın öncülerinden biri
async/awaitkalıbının kökeni F# 2.0’a dayanır; sonrasında C#, JavaScript ve başka dillere etki etmiştir- F#, eşzamansız programlamayı callback kullanmadan da sezgisel biçimde kurabilen bir yapı sunar
- Kod akışı senkronmuş gibi okunur, ama gerçekte asenkron çalışır
-
Microsoft’un yatırımı ve dilin gelişimi
- Microsoft uzun süre F# için sınırlı insan kaynağı ayırmış olsa da, 2022’de Prag’da özel bir ekip kurarak ciddi yatırımı başlattı
- F# 8.0 ve 9.0 sürümleriyle birlikte dil ve araçlar hızla iyileşiyor
- Microsoft içinde ilginin artması, gelecekteki gelişim potansiyeli açısından da umut veriyor
F#, öğrenmesi kolay ama güçlü bir tip sistemi ve fonksiyonel programlama paradigması sunan pratik bir dildir; özellikle .NET tabanlı projelerde fonksiyonel yaklaşımı benimsemek isteyen geliştiriciler için çok cazip bir seçenektir
Ekosistem (Ecosystem)
- F#’ı nispeten kısa süre kullanınca görülen şey, yalnızca F#’a özel saf kütüphane ve framework sayısının çok fazla olmadığı
- Kullanıcıların çoğu, .NET’in temel API’lerine ve C# merkezli tasarlanmış üçüncü taraf kütüphanelere dayanıyor
- Bu, Scala, Clojure, Groovy gibi hosted language’lerde sık görülen bir durum
-
Web geliştirme için başlıca kütüphaneler
- Giraffe: ASP.NET Core tabanlı, fonksiyonel stili benimseyen hafif bir web framework’ü
- Suave: Routing ve iş akışı bileşimi için combinator tarzı basit bir web sunucusu framework’ü
- Saturn: Giraffe üzerine kurulu MVC tarzı bir framework; Ruby on Rails ve Phoenix’ten ilham alır
- Bolero: WebAssembly ve Blazor tabanlı istemci uygulaması geliştirme framework’ü
- Fable: F#’ı JavaScript’e transpile ederek React, Node.js ve diğer JS ekosistemleriyle birlikte çalışmasını sağlar
- Elmish: Fable ile sık kullanılan, MVU(Model-View-Update) kalıbına dayalı bir UI framework’ü
- SAFE Stack: Saturn, Fable, Elmish, Azure vb. bileşenleri birleştiren uçtan uca fonksiyonel web geliştirme yığını
-
Veri bilimi için başlıca kütüphaneler
- Deedle: pandas tarzı veri analizi ve işleme kütüphanesi
- DiffSharp: Makine öğrenmesi ve otomatik türev sağlayan matematik odaklı kütüphane
- FsLab: Görselleştirme ve istatistiksel analiz araçları içeren bütünleşik veri bilimi araç takımı
Dokümantasyon durumu
- Resmi belgeler genel olarak iyi düzenlenmiş ve yüksek kaliteli
- Bir kısmı Microsoft Docs’ta, bir kısmı da F# Software Foundation üzerinde dağılmış durumda
- Yapı yer yer biraz dağınık hissettirse de, dil stil kılavuzu, tasarım belgeleri ve standart kütüphane API’si çok faydalı
-
Önerilen belge bağlantıları
-
Topluluk öğrenme kaynakları
- F# for Fun and Profit: eğitimler ve denemelerden oluşan bir koleksiyon (biraz eski olsa da hâlâ geçerli)
Geliştirme araçları (Dev Tooling)
- F# geliştirme araçları ekosistemi geçmişte yalnızca Visual Studio için optimize edilmişti ve diğer editörlerdeki destek zayıftı
- Neyse ki son 10 yılda araç ortamı büyük ölçüde iyileşti
-
Teknik dönüm noktası: FSharp.Compiler.Service(FCS)
- FCS, F# derleyicisini, editör destek özelliklerini ve scripting motorunu tek bir kütüphanede sunar; böylece F# farklı editör ve araç ortamlarında kullanılabilir hale gelir
- Bu sayede VS Code, belge üreticileri ve alternatif backend’lerde F# desteği mümkün oldu ve ekosistemin genişlemesinin önü açıldı
- Bunun en bilinen örneklerinden biri Ionide; VS Code’da zengin F# desteği sunuyor ve 1 milyondan fazla indirme sayısına ulaşmış durumda
-
Test edilen editörler
- Emacs (
fsharp-mode): temel özellikler sunuyor, TreeSitter desteği yok, geliştirme etkinliği düşük - Zed: F# desteği sınırlı
- Helix: temel destek mevcut
- VS Code (Ionide eklentisi): en olgun ortamlardan biri
- JetBrains Rider: ticari bir IDE olsa da F# desteği çok güçlü
Özelliklerin çoğu F# dil sunucusu olan
fsautocompleteüzerine çalışıyor; LSP desteği iyi olan tüm editörler kullanılabilir - Emacs (
-
Eksik kalan yönler
fsharp-mode, eski bir kod tabanına dayanıyor ve yavaş gelişiyor- Zed’de özellikler yetersiz
- VS Code’da bazı özellikler (ör. seçim alanını büyütme/küçültme) düzgün çalışmıyor
- Tuş atamaları / modal model nedeniyle VS Code’u rahatsız edici bulan kullanıcılar da var
-
Kod biçimlendirici ve linter’lar
- Fantomas: F#’ın resmi kod formatter’ı; kullanıcıların ve ekiplerin çoğu tarafından kullanılıyor
- FSharpLint: bir dönem popülerdi, ancak bugün fiilen durma noktasında
- Yine de güçlü derleyici sayesinde linter bağımlılığı daha düşük
-
Diğer araçlar
Kullanım alanları (Use Cases)
- .NET’in geniş ekosistemi sayesinde F# çeşitli alanlarda kullanılma potansiyeline sahip
- Özellikle Type Providers özelliği sayesinde veri analizi ve veri işleme işleri için çok uygun
- Backend servisler ve tam yığın uygulama geliştirme için de uygun; bazı araçlar frontend geliştirmeyi de mümkün kılıyor
-
Başlıca kullanım alanları
- Veri analizi: F#’ın type provider’ları ile statik tip tabanlı veri işleme yapılabilir
- Backend servisleri: .NET’in güçlü web framework’leri ile birlikte F# kullanılabilir
- Frontend uygulamaları: Fable ve Elmish ile JS ekosistemiyle entegre UI geliştirme mümkündür
Fable 4ile birlikte TypeScript, Rust, Python gibi farklı dillere de transpile edilebiliyor
-
Fable örnekleri (basit transpile komutları)
- JavaScript:
dotnet fable - TypeScript:
dotnet fable --lang typescript - Python:
dotnet fable --lang python
- JavaScript:
Topluluk durumu
- Genel olarak topluluk büyük değil; hatta OCaml’dan da küçük olabilir
- En aktif iletişim kanalları Reddit ve Discord
- Slack topluluğu da var, ancak davet otomasyon sistemindeki sorunlar nedeniyle erişmek zor
- Microsoft’un topluluk içindeki rolü net değil; topluluğun yönlendiriciliği daha baskın
-
Topluluk tarafından yürütülen başlıca kaynaklar
- Amplifying F#: F#’ın yaygınlaşmasını ve şirket katılımını teşvik ediyor
- F# for Fun and Profit: eğitim ve deneme arşivi
- F# Lab: veri bilimi için F# topluluk araç takımı
- F# Weekly: güncel F# gelişmelerini derleyen bülten
Popülerlik ve gerçekler (The Popularity Contest)
- F#, çoğu popülerlik göstergesinde (TIOBE, StackOverflow, iş ilanları vb.) üst sıralarda yer almıyor
- Ancak bu, büyük ölçüde çoğu fonksiyonel dilin karşı karşıya olduğu bir gerçeklik; yalnızca F#’a özgü değil
- Hâlâ ana akım olmasa da, Clojure, OCaml, Emacs Lisp gibi diğer fonksiyonel dillerle benzer ölçekte bir kullanıcı kitlesine sahip
-
Neden F# kullanmalı?
- Programlama dili seçmenin nedeni yalnızca iş bulma ihtimali değildir
- Eğlence için (F#’daki F’nin “Fun” anlamına geldiği de söylenir)
- Yeni paradigmaları ve fikirleri öğrenmek
- Alışılmış düşünme biçiminden çıkıp başka türlü düşünmeyi öğrenmek
- Programlama dili seçmenin nedeni yalnızca iş bulma ihtimali değildir
-
İlgili kaynaklar
F# ve OCaml karşılaştırması
F#’ın ilk amacı, OCaml’ın güçlü yanlarını .NET’e, .NET’in güçlü yanlarını da OCaml’a taşımaktı
– Don Syme, F#’ın yaratıcısı
- F#, OCaml’dan ilham alınarak geliştirildi ve ilk dönemlerde
.ml,.mlidosya uzantılarını bile destekleyecek kadar benzerdi - Zamanla daha bağımsız bir dil haline geldi ve bugün her ikisi de kendi yönünde gelişiyor
-
F#’ın avantajları
- .NET platformu tabanlı olması
- Çok büyük bir kütüphane havuzundan yararlanabilmesi
- Microsoft desteği
- Yeni başlayanlara daha dost olması
- Nesne yönelimli diller (C# vb.) kullananlara tanıdık gelen sözdizimi
- Derleyici hata mesajlarının görece daha açık olması
- Debug deneyiminin daha sezgisel olması
- Güçlü eşzamansız programlama desteği
- OCaml’da olmayan özellikler sunması
- Anonim record’lar
- Active pattern’ler
- Computation expression’lar
- Sequence comprehension’lar
- Type provider’lar
- Units of measure
- .NET platformu tabanlı olması
-
F#’ın dezavantajları
- .NET platformu tabanlı olması
- Dil tasarımında
.NETile birlikte çalışabilmek için çok sayıda ödün var (nullkabulü gibi)
- Dil tasarımında
- Microsoft’a ait olması
- Microsoft’a yönelik tutumlara göre tercih farkı olabilir
- F# için ayrılan kaynaklar nispeten sınırlı
- Uzun vadede MS’in F#’ı ne kadar destekleyeceği belirsiz
- İsimle ilgili sorunlar
PascalCase,camelCaseadlandırma kurallarını sevmeyenler için rahatsız edici olabilir- F# adı arama ya da dosya adı bağlamında sorun çıkarabilir (bu yüzden sık sık FSharp da denir)
- OCaml’daki bazı ileri özelliklerin eksikliği
- Birinci sınıf modüller, functor’lar
- Yetersiz GADT desteği
- Maskotu yok, devesi de yok
- .NET platformu tabanlı olması
-
Ortak yönler ve karşılaştırma
- Her iki dil de JavaScript runtime’ını hedefleyebilir
- F#: Fable
- OCaml: js_of_ocaml, Melange
- Şu anda Fable daha olgun hissettiriyor, ancak gerçek kullanım deneyimine daha çok ihtiyaç var
- İkisi de güçlü ama niş diller ve kısa vadede geniş kitlelere ulaşmaları pek olası görünmüyor
- F#, mevcut C# kod tabanlarına kademeli olarak sızabilecek pratikliğe sahip
- Eksilerden biri, F# projelerinin hâlâ XML tabanlı proje dosyaları kullanması ve derleme sırasının elle belirtilmesini gerektirmesi
- Bu durum, OCaml’ın
Dunebuild sistemiyle kıyaslandığında daha zahmetli gelebilir
- Bu durum, OCaml’ın
- Eğitsel amaçlar veya dil yapısını öğrenmek için OCaml daha uygun olabilir
- Pratik web servisleri ya da backend geliştirme söz konusuysa F# daha iyi bir tercih olabilir
- Özellikle
.NETile iyi entegre olurken fonksiyonel stili koruyabilen bir dil olarak F#, çok güçlü bir araçtır
- Her iki dil de JavaScript runtime’ını hedefleyebilir
Kapanış notları
- Yazara göre F#, beklediğinden çok daha eğlenceli ve pratik bir dil çıktı
- Bunu, geçmişte Clojure ile ilk tanıştığındaki hisse benzetiyor
- Özellikle Clojure’un Java ile mükemmel birlikte çalışabilirliği sayesinde en pratik Lisp oluşunu hatırlatıyor
- Eğer .NET baştan beri açık kaynak ve taşınabilir olsaydı,
- ClojureCLR bugün olduğundan daha popüler olabilirdi
- F# topluluğu ve ekosistemi de daha fazla büyüyebilirdi
- F#’ın 2010’a kadar açık kaynak olmaması da erken benimsenmesinin önünde engel olmuş
".NET ve F#’ın başta açık kaynak olmaması en büyük hataydı; bu yüzden pek çok fırsat kaçtı" – Don Syme
- OCaml öğrenmesi zor bir dil değil, ama ML ailesinden bir dili ilk kez öğrenecekler için F# daha kolay olabilir
- Üretime kadar giden yolun giriş eşiği de daha düşük
- Özellikle .NET deneyimi olan geliştiriciler için F#’ı mutlaka denemeye değer olduğu vurgulanıyor
- F#, tek başına da harika bir dil olmasının yanında, .NET’in güçlü ekosisteminden yararlanma fırsatı sunuyor
- Fable gibi araçlarla F# kodu JavaScript, Dart, Rust, Python gibi dillere transpile edilebiliyor
- F# topluluğunda “F#’daki F, Fun’dır” sözü var
- Yazar da bizzat deneyince bunun doğru olduğunu, yalnızca eğlenceli değil aynı zamanda pratik de olduğunu söylüyor
- Son olarak, “derleme başarılıysa çoğu şey düzgün çalışır” yaklaşımıyla F#’ın sunduğu kararlılık ve güvenilirlik de anılıyor
In sane type systems we trust!
1 yorum
Hacker News görüşleri
F#, bir Ruby on Rails uygulamasını yeniden yazarken en iyi fonksiyonel dildi
dotnetkütüphanelerine erişilebilen harika bir ekosistemi varF# denendi ama .NET ekosistemi yeniydi
hello worldiçin çok sayıda proje dosyası ve boilerplate üretilmesine şaşırıldıBizim şirketimiz 6 yıl önce C#’tan F#’a geçti
F# benimsenmesinin duraklamasının nedeni kötü build sistemi
F# 2013’te öğrenildi ve çok eğlenceliydi
F#, tüm kullanıcılarının çok memnun olduğu nadir örneklerden biri
C#, F#’ın birçok özelliğini kazandıkça F#’ın avantajı azalıyor
Tamamen F# ile yazılmış kârlı bir SaaS var
F# harika bir dil
fsharpforfunandprofit.comsık sık referans alınıyorF# güzel ama akıcı biçimde kullanmak zordu