Scala 101 gibi bir yazı

Selam arkadaşlar,

İşyerinde yine bir teknolojik atılım gerçekleştirdik ve JVM üzerinde çalışan fonksiyonel ve nesne yönelimli dil olan Scala’yı projelerimizde kullanmaya başladık.

Açıkçası ne zamandır fonksiyonel dilleri kullanmak istiyordum ama fırsatım olmuyordu, javascriptte jquery kullanmaktan öteye gidememiştik. Sonuç olarak Scala kullanmaya başlayarak zihinsel haritamızda büyük bir atılım yapmış olduk.

Peki fonksiyonel programlama nedir? Çok kısa bir tanımla açıklama gerekirse, programlarınızı statementlar yerine fonksiyonlar olarak düşünmektir. Yani mümkün olduğu kadar en küçük birimlerin fonksiyonlardan oluşması olarak adlandırabiliriz. Bu tanımdan hareketle fonksiyonel dillerin bunu sağlayabilmesi için fonksiyonları temel veri yapılarından sayması gerekir. Bu sağlandığında fonksiyonları parametre olarak kullanabilir, değişkenlere atayabilir, gerektiğinde çağırabilirsiniz. Bir diğer gerekli özellik ise, fonksiyonların sadece aldığı parametrelere göre dönüş değerleri üretmesidir. Yani gönderdiğiniz parametrelerde değişiklik yapılmamalıdır.

Bunlardan yola çıkarak Scala’daki (diğer fonksiyonel dillerde de kullanılmakta olan) bir kaç temel özellikten bahsedeyim.

  1. Fonksiyon literalleri : Scala da sadece fonksiyon tanımlamak zorunda değilsiniz, şunu da yapabilirsiniz: val ekle = (x: Int, y: Int) => x + y . Bu aşamada fonksiyonu istediğiniz zaman çağırabilir, diğer fonksiyonların içinde kullanabilirsiniz, parametre olarak geçebilirsiniz.
  2. map fonksiyonu : Bir liste üzerindeki tüm elemanlar üzerinde çalışıp, yeni bir liste üreten fonksiyon.
  3. filter fonksiyonu : Bir liste üzerindeki tüm elemanlar üzerinde çalışıp, verilen teste uygun olanlardan yeni bir liste üreten fonksiyon.

Bu 3 temel özellik ile yazdığınız programlar hem çok kısalır hem de anlaşılması daha kolay olur. Ufak tefek fonksiyonları birbirleriyle kullanarak çok anlamlı ve işlevsel programlar yazabilirsiniz. (Tıpkı Unix command line araçları gibi)

Map ve fonksiyon literallerine bir örnek :

scala> val l = List(1,2,3,4,5)

scala> l.map( x => x*2 )

res60: List[Int] = List(2, 4, 6, 8, 10)

Bunların üzerine daha çok gideceğiz ilerideki yazılarda, takibe devam!