Fonksiyonel Programlama (F#)

Eyl 06, 2013

Fonksiyonel programlama, 1955 yılında IPL tarafından bulunmuştur. İlk olarak FORTRAN tarafından daha sonra COBOL tarafından kullanılmıştır. 1970’li yıllardan itibaren Nesneye Dayalı Programlama(Object Oriented) çıkmış ve en popüler dil haline gelmiştir. Fonksiyonel programlama dilleri de aynı şekilde nesneye dayalı programlar kadar olmasa da kararlı ve güçlü bir biçimde gelişimine devam etmiştir. Bu gelişimlerin bir yansıması olarak da günümüzde birçok mühendislik bilimleri fakültelerinde ders olarak okutulmakta olan MATLAB programının oluşmasına katkı sağlamıştır. Matematiksel, fiziksel ve mühendislikteki birçok işlemi oldukça kolay fonksiyonlarla yapılabilmesine olanak sağlamaktadır.

F#
Zannedilebilecegi gibi "İşlevsel Programlama" değil, fonksiyon tabanlı programlamaya yakın bir kavramdır. Çözülmesi zor olan bilgisayar problemlerini basit yöntemler ile çözmeyi sağlayan fonksiyonel programlama ,genel programlama teknikleri ile yapılan çözümler için yeterince iyi değildi. Bu sebeple fonksiyonel programlama, nesne yönelimli programlama mimarisinin mantıki yapısını içererek ve fonksiyonel programlama prensiplerinden vazgeçilmeden, işlemlerin daha rahat yapılabilmesine olanak tanımaktadır. Bu dil F# ‘dır. F#, fonksiyonel programlama dilinin daha da genelleştirilmiş halidir. Finansal veriler, matematiksel işlemler ve matematik fonksiyonları ile yapılacak işlemler var ise F#, C#’a tercih edilmesinin nedeni performansının daha iyi olmasıdır. Büyük veriler ya da Matlab’da olduğu gibi matrisler ile matematiksel işlemler yapılmak isteniyorsa, F# ile çalışılması önerilmektedir. Derlenen programlar .NET IL (Intermediate Language) koduna derlendiği ve bunlar da JIT (Just In Time compilation) olarak çalıştırıldığı için performans gayet iyi görünmektedir.

C# gibi bir dille kıyaslandığında çok daha az ve öz şekilde algoritmaları ifade edebilen F#, etkileşimli kabuğu sayesinde de dosyadaki kaynak kodun bir kısmını seçip "ALT+ENTER" gibi bir tuş kombinasyonu ile de sadece o kısmın çalışmasını ve sonuçların hemen görülmesini sağlıyor.

Kod 1: Tamsayı Aritmetik (Integer Arithmetic)

let SampleArithmetic1() =
let x = 10 + 12 - 3 
let y = x * 2 + 1 
let r1,r2 = x/3, x%3
printfn "x = %d, y = %d, r1 = %d, r2 = %d" x y r1 r2

Çıktı 1:  

x = 19, y = 39, r1 = 6, r2 = 1

Kod 2: Kesirli Aritmetik (Floating Point Arithmetic)

let SampleArithmetic3() =
let pi1 = float 3  + 0.1415  
let pi2 = double 3 + 0.1415  
printfn "pi1 = %f, pi2 = %f" pi1 pi2

let i1 = int 3.1415 
let i2 = int64   3.1415 
printfn "i1 = %d, i2 = %d" i1 i2
  
let f32a = 2.1415f + 1.0f           
let f32b = 2.1415f + float32 1       
printfn "f32a = %f, f32b = %G" f32a f32b
  
let byteA = byte (3+4)          
let byteB = 255uy              
let byteC = 0xFFuy              
let byteD = byte 0xFF          
printfn "byteA = %d, byteB = %d" byteA byteB
 
Çıktı 2:   

pi1 = 3.141500, pi2 = 3.141500
i1 = 3, i2 = 3    
f32a = 3.141500, f32b = 3.1415
byteA = 7, byteB = 255

Kod 3: Çeşitli Sayıssal Tipler Arası Dönüşüm (Convert Between Various Numeric Types)

let FunctionSample1() = let twice x = x + x 
printfn "twice 2 = %d" (twice 2)
printfn "twice 4 = %d" (twice 4)
printfn "twice (twice 2) = %d" (twice (twice 2))

Çıktı 3: 

twice 2 = 4
twice 4 = 8
twice (twice 2) = 8

Kod 4: Başka bir fonksiyondan, fonksiyon çağırma

let FunctionSample2() =
let even n = (n%2 = 0) 
let tick x = printfn "tick %d" x 
let tock x = printfn "tock %d" x 
let choose f g h x = if f x then g x else h x 
let ticktock = choose even tick tock  
   
çıktı 4:

tick 0
tock 1
tick 2
tock 3
tick 4
tock 5
tick 6
tock 7
tick 8
tock 9
tick 10

ticktock(tiktak), choose(seçim) kullanılarak diğer fonksiyonlar tarafından oluşturulan bir fonksiyondur.