Fonksiyonel programlamadan önce bu işin matematiksel tabanını kavramak için temel kavramları ve lambda calculusu temel seviyede açıklayacağım.Bu konuyu öğrenirken ,kullandığım kaynaklarıda ilk olarak paylaşmak istiyorum.
Kaynakça
- https://blog.lacriment.com/
- https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-820-fundamentals-of-program-analysis-fall-2015/lecture-notes/
- https://www.youtube.com/watch?v=UIUlFQH4Cvo&list=PLX15ZXZzrWp5l1WkN5VkhmrbVp_ybNFRZ&index=1
- https://cs.lmu.edu/~ray/notes/paradigms/
FONKSİYON NEDİR ?
Fonksiyon matematikte değişken sayıları girdi olarak kabul edip bunlardan bir çıktı sayısı oluşmasını sağlayan kurallardır. Bir işlem türüdür.İşlev
FONKSİYON İLE İLGİLİ KAVRAMLAR VE ÇALIŞMA YAPISI
TANIM KÜMESİ (GİRDİ-İNPUT): Fonksiyona girdiğimiz değerler veya girdiğimiz değerlerin oluşturduğu kümedir.
DEĞER(GÖRÜNTÜ) KÜMESİ,(OUTPUT,ÇIKTI):Fonksiyona değerleri girdiğimizde çıkan sonuçtur.
BİR FONKSİYON NASIL ÇALIŞIR?
Eski teyplere bakalım,kasedi koyarsın ,play butonuna basarsın ve müzik çalmaya başlar.Burada kaset girdion ,teyf fonksiyon oluyor veya çivi ve çekiçten örnek verelim.Çivi girdi ve çekiç fonksiyon ,yapılan işte çıktı(değer kümesi) .Matematik kısmına gelelim .
Örneğin f(x)=2x+3 bu fonksiyonda amaç yazdığımız sayının 2 katının 3 fazlasını bulmak.x yerine 2 yazdığımızda 2.2=4+3=7 olur.Başka bir örnek oluşturalım f(x)=x+4 girdiğimiz sayının 4 fazlasını veriyor.
LAMBDA CALCULUS NEDİR ?
Lambda calculus ,fonksiyonları soyutlama(abstraction),bağlama (binding),uygulama(application) ve ikame etme(substitution) kavramları üzerine kurulu bir hesaplama modelidir.Alonzo church geliştirmiştir.
LAMBDA CALCULUS KURALLARI
LAMBDA FONKSİYON NEDİR
Lambda fonksiyonu ,Lambda kalkülüsten türetilmiş anonim fonksiyonlar yazmamızı sağlayan fonksiyondur.
LAMBDA FONKSİYONUN YAPISI
expr -> λ var.expr| expr expr| var (expr) |
not:Bu ifade Context-Free Grammar ile oluşturulmuştur.Bir ifade lamba değişkeni.ifade veya ifade ifade veya parantez içinde değişken olabilir.Not:sayıların mutlaka tam sayı olması gerekli.
ÖRNEK FONKSİYONLAR
|λ|x.(x+1) ifadesi f(x)=x+1 ifadesi ile aynıdır ,|λ|x ifadesi değişkeni oluşturur.(x+1) ise fonksiyonu işlevidir.Başka bir fonksiyon daha yazalım,bir sayının karesini alan fonksiyonu yazalım |λ|x.(x*x) “bu ifadenin anlamı ise x değişkeni al kendisi ile çarp demektir.(+,-,*,/) sadece 4 temel işlemi yapabiliriz.Şimdi ise 2 ve daha fazla değişken kullanalımi ,|λ|x.|λ|y.(x+y) burada ise x ve y değişkenini topluyoruz.
LAMBDA FONKSİYONLARLA MANTIKSAL OPERATÖRLER
TRUE =|λ|x.|λ|y.x burada x ve y değişkeni girilip x değeri çıktı olarak gelir.FALSE =|λ|x.|λ|y.y 2 değişken girilip y değişkeni çıktı olarak gelir.NOT =|λ|.b.b.FALSE.TRUE girilen herhangi bir değerinin zıttını çevirir.
FONKSİYONEL PROGRAMLAMA
Bunca teoriden sonra artık birşeyler programlamaya başlayalım ancak kullanacağımız programlama dillerini belirlemek gerekli,öncelikli olarak haskell,lisp, elm,Ocaml fonksiyonel programlama dilidir ve birçok farklı programlama dilide (python,c# vb) ile fonksiyonel programlama yapılabilmektedir.
FONKSİYONEL PROGRAMLAMANIN DİĞER PARADİGMALAR ARASINDAKİ FARKLAR
Paradigma:bir bilim dalı ile ilgilenen bir grup bilim insanları tarafından ortaklaşa kabul edilen görüşlerdir , bir bakış açısıyla oluşan değer, fikir, inanç ve tekniklerin bir dizisidir.Tanımımızı yaptıktan sonra programlama paradigmalarını karşılaştıralım.Örneğin nesne yönelimli programlama (oop) ve fonksiyonel programlamayı karşılaştırdığımızda fonksiyonel programlamanın en büyük avantajı yan etkileri olmaması ve paralel programlamayı desteklemesidir.(Not:ihtiyaca göre paradigma ve programlama dili seçilmelidir.) Daha detaylı karşılaştırma için buraya bakabilirsiniz .
BİRAZ KOD
Öncelikle düşünüldüğü kadar farklı bir yapı yok,değişken tanımlama,kulanılan veri tipleri zaten değişmiyor vb temel konular zaten değişmiyor.Gelelim fonksiyon yazımına.
ANONİM/LAMBDA FONKSİYONLAR
Bu tip fonksyionların en büyük amacı basit işlemleri hızlıca programlayabilmektir 1.fonksiyonumuz javacripte ait bir anonim fonksiyondur.2.kod ise haskelle ait basit bir lambda fonksiyondur.2 sayıyı toplayan bir fonksiyon yazdık
1 2 |
var sum = function (a, b) { return a + b }; sum(3,5) |
1 |
(\x y -> x + y) 3 5 |
Ardından örnek olarak döngüsel işlemleri inceleyelim javascript ile for döngüsünü kullanarak ufak bir çarpım tablosu hazırladım.Canlı görmek için buraya bakabilirsiniz.
1 2 3 4 5 6 7 8 9 10 11 |
<script> document.write("<table border='1px'>"); for(var i = 1; i <= 10; i++){ document.write("<tr style='height:30px;'>"); for (var k = 1; k <= 10; k++) { document.write("<td style='width:30px;'>" + i*k + "</td>"); } document.write("</tr>"); } document.write("</table>"); </script> |
Bu işi fonksiyonel programlama ile haskell kodlayarak yaparsak. Listeler ve/veya recursive fonksiyonlar kullanarak çeşitli Canlı olarak buradan çalıştırabilirsiniz.
1 |
main = print $ [x*y | x <- [1..10], y <- [1..10]] |
Bu yazımızdaki amaç fonksiyonel programlamanın matematiksel arkaplanını ve giriş seviyesinde anlatımı şeklinde hazırladım.İleride bu paradigmayı kullanarak zaten birşeyler geliştireceğiz.Sorularınızı mutlaka bekliyorum.Ve tekrar görüşmek dileğiyle