
Konuya başlamadan önce neden bu yazıyı yazdığımdan kısaca bahsedeyim.
Bazı problemlerde OOP yaklaşımının biraz eksik kaldığını farkettim ve araştırmalarım sonucu fonksiyonel programlama ile bu sorunların üstesinden gelebileceğimi gördükten sonra öğrendiğim bilgileri paylaşmak istedim. 🤓
Fonksiyonel programlama şudur diye bir şey söylemiyorum fakat prensiplerinden bahsederek bir çerçeve çizmeye çalışacağım.
First-class functions
Bir fonksiyon diğer fonksiyonlara argüman olarak geçirilebilir, başka bir fonksiyon tarafından döndürülebilir ve bir değişkene değer olarak atanabilir.
High-order functions
Genelde fonksiyon yazdığımızda bir şeyler return ederiz.(String, Integer, Array,.. ).
func = lambda name : name
High-order functions ise geriye fonksiyon döner.
Klasik örneğini vereyim :
Immutable data
Bir fonksiyona bir global’de tanımlı Array verdiğimizi hayal edelim. Senaryomuz şöyle olacak → Bu fonksiyonumuz içerde bir takım işlemler yapıyor(ekleme, silme, güncelleme …)
Başka bir fonksiyonumuz ise bu globaldeki dizi ile işlemler yapmak istiyor fakat ilk fonksiyon globaldeki diziyi değiştirdiği için bu dizi artık değişmiş oldu.
Bu durum ise istemediğimiz bir olay ve buna yan etki(side effect) deniyor. Fonksiyonel programlamanın başka bir prensibi olan pure functions(saf fonksiyonlar) bu durumun önüne geçmesi için var.
Bunu Python’da tuple ile sağlayabiliriz(**)
** tuple içinde array olduğu durumlarda array içine veri manipülasyonu yapabiliriz. Daha detaylı açıklamayı Fluent Python kitabında bulabilirsiniz.
Pure functions

Pure functions(Saf fonksiyonlar) kısaca açıklamak gerekirse :
- Aynı giriş verildiğinde, her zaman aynı çıkışı döndürür.
- Side effect(Yan etki) olmasını engeller.
adder = lambda x,y : x + y
Yani buradaki amaca verdiğim değerlerin değişmeden işlem yapılıp bir değer döndürme işlemi diyebiliriz.
Recursion
Bunu palindrome(Terstden okununca aynı kelimeler) kelimeler üzerinden anlatmaya çalışayım.
Klasik yoldan for, while ile yapılan işleri fonksiyonlar yardımı ile yapmamızı sağlar(Kendini tekrar çağırarak)
Lazy evaluation
Bunu da örnekle açıklamak istiyorum örneğin elimizde fonksiyonumuz var ve bu fonksiyon sonsuza kadar giden bir şeyler üretiyor. (Asal sayılar, fibonacci, …)
Lazy evaluation burda devreye giriyor.
Bunu daha iyi anlamak için generators konusuna bakılabilir.
Kullanılan fonksiyonlar
Map
Dizinin her elemanı için, parametre olarak verilen fonksiyonu çağırır ve oluşan sonuçlarla da yeni bir dizi oluşturur.
Filter
Dizinin her elemanı için belirtli şartlara göre filtre yapıp yeni bir dizi döndürür
Reduce
Faktoriyeli alan bir uygulama :
Sonuç
Fonksiyonel programlamanın neden kullanmalıyız ?
- Side effect leri ortadan kaldırmak için
- Pure function oluşturarak immutability sağlamak için
Fonksiyonel programlamayı elimden geldiği şekilde anlatmaya çalıştım.
İyi okumalar,