Sunum yükleniyor. Lütfen bekleyiniz

Sunum yükleniyor. Lütfen bekleyiniz

Fonksiyonel Programlama Dilleri

Benzer bir sunumlar


... konulu sunumlar: "Fonksiyonel Programlama Dilleri"— Sunum transkripti:

1 Fonksiyonel Programlama Dilleri
Bölüm 15 Fonksiyonel Programlama Dilleri

2 15. Bölüm konuları Giriş Matematiksel fonksiyonlar
Fonksiyonel programlama dillerinin temelleri İlk fonksiyonel programlama dili LISP Scheme Haskell Fonksiyonel dillerin uygulama alanları Fonksiyonel ve komut dillerinin karşılaştırması Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ

3 Giriş Komutlu diller direkt olarak von Neumann mimarisi ne dayalı
Birinci öncelik verimlilik, yazılım geliştirmeye uygunluk değil Fonksiyonel dillerin tasarımı matematiksel fonksiyonlara dayalı Sağlam kuramsal temel. Kullanıcıya yakın. Üzerinde çalışacağı makine ile uyumunu önemli değil. Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ

4 Matematiksel fonksiyonlar
Matematiksel fonksiyon: bir kümeden başka bir kümeye eşleme lambda ifadesi: fonksiyonun parametrelerini belirtir. cube = (x).x * x * x Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ

5 Lambda ifadeleri Lambda ifadeleri isimsiz fonksiyonları belirtir
Lambda ifadelerinin parametrelere uygulanışı: parametreler fonksiyondan sonra yazılır. ör: ((x). x * x * x) 2 (cevap: 8) Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ

6 Yüksek-sıralı fonksiyon
Yüksek-sıralı (higher-order) fonksiyon, başka bir fonksiyonu parametre olarak alır ve/veya netice olarak verir Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ

7 Fonksiyon bileşimi (composition)
İki fonksiyonu parametre olarak alıp, birinci fonksiyonu, ikinci fonksiyonun neticesine uygulayan tek bir fonksiyon veren yüksek sıralı bir fonksiyon. Gösterim: h  f ° g h (x)  f ( g ( x)) f (x)  x + 2 ve g (x)  3 * x ise h  f ° g = (3 * x)+ 2 Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ

8 Hepsine-uygula Bir fonksiyon ve bir listeyi parametre olarak alıp, fonksiyonu listenin her elemanına uygulayan yüksek sıralı fonksiyon. Gösterim:  h (x)  x * x ise ( h, (2, 3, 4))bize (4,9,16)verir Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ

9 Fonksiyonel programlama dillerinin temelleri
Amaç: mümkün olduğunca matematik fonksiyonlarını taklit etmek Hesaplama yöntemi: Fonksiyon ugulama Değişkenler tek atamalık (bir tür sabit) Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ

10 Atıfsal saydamlık (referential transparency)
Saf bir fonksiyonel programlama dilinde, bir fonksiyonun parametrelere uygulanması her zaman ayni neticeyi verir (çağrılmanın nerde olduğunun önemi yok) Yerel olmayan tanımlanmışlara erişilmediğinde geçerli Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ

11 LISP veri tipleri ve yapıları
Veri tipleri: önceleri sadece atomlar ve listeler Liste şekli: parantez içinde alt listeler ve atomlar ör: (A B (C D) E) LISP listeleri, hafızada tekli bağlamalı listeler şeklinde saklanır. Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ

12 LISP tercümesi '(A B C) A, B ve C atomlarından oluşan listedir
(A B C) B ve C parametrelerine uygulanan A fonksiyonudur Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ

13 Scheme 1970’lerde gerçeklenmiş, benzerlerine göre daha “temiz”, modern ve basit LISP lehçesi Statik etki alanı kullanır Fonksiyonlar birinci sınıf varlık İfadelerin değeri ve listelerin elemanı olabilirler Değişkenlere atanabilir, parametre olarak geçilebilirler Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ

14 Hesaplama Parametreler hesaplanır (sıra belirsiz)
Parametrelerin değerleri fonskiyon gövdesinde paremetrelerin yerlerine konur. Gövdedeki son ifadenin değeri fonksiyonun değeridir Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ

15 Basit fonksiyonlar Aritmetik: +, -, *, /, ABS, SQRT, REMAINDER, MIN, MAX ör: (+ 5 2) bize 7 verir QUOTE – tek parametre alır, parametreyi hesaplamadan verir Listeleri fonksiyon çağırması olarak değerlendirmemek için kullanılır QUOTE tek tırnak olarak da yazılabilir. '(A B) ile (QUOTE (A B)) ayni şeyi ifade eder Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ

16 Fonksiyon tanımı: LAMBDA
Lambda ifadeleri (isimsiz fonksiyonlar) Şeklini  notasyonundan alır ör: (LAMBDA (x) (* x x)) x bağlı değişken olarak anılır (bound variable) Lambda ifadeleri uygulanabilirler ör: ((LAMBDA (x) (* x x)) 7) Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ

17 Özel fonksiyon: DEFINE
Foksiyon tanımlamaya yarayan ve sembollere değer bağlamaya yarayan özel şekil İki türü var: Sembolü değere bağlamak için ör: (DEFINE pi ) Kullanım örneği: (DEFINE two_pi (* 2 pi)) İsimleri lambda ifadelerine bağlamak için ör: (DEFINE (square x) (* x x)) şuna eşdeğer: (DEFINE square (lambda (x) (* x x))) Kullanım örneği: (square 5) - Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ

18 Özel fonksiyon: DEFINE…
DEFINE için hesplama süreci diğer fonksiyonlara göre farklı. İlk parametre hiç hesplanmaz. Ikinci parametre hesaplanır ve birinciye bağlanır. Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ

19 Çıktı (output) fonksiyonları
(DISPLAY expression) (NEWLINE) Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ

20 Sayısal yüklem (predicate) fonksiyonları
#T doğru, #F yanlış demek. =, <>, >, <, >=, <= EVEN?, ODD?, ZERO?, NEGATIVE? Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ

21 Kontrol akışı: IF Seçim (IF predicate then_exp else_exp) ör:
(IF (<> count 0) (/ sum count) 0) Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ

22 Kontrol akışı: COND Çoklu seçim (COND (predicate_1 expr {expr})
... (predicate_n expr {expr}) (ELSE expr {expr})) Önce doğru olan ilk şart bulunur, o şartın sağındaki son değer cevaptır. Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ

23 COND örneği (DEFINE (compare x y) (COND
((> x y) “x is greater than y”) ((< x y) “y is greater than x”) (ELSE “x and y are equal”) ) Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ

24 CONS ve LIST liste fonksiyonları
CONS iki parametre alır. Birincisi bir atom veya liste, ikincisi bir liste. Birinci parametrenin ikinci parametrenin başına koyulmuş halini yeni bir liste olarak verir. ör: (CONS 'A '(B C)) bize ‘(A B C)verir. LIST aldığı parametrelerin listesini verir. Ör: (LIST 'a 'b 'c) bize '(a b c) verir. Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ

25 CAR ve CDR liste fonksiyonları
CAR liste cinsinden parametre alır, ilk elemanını verir Ör: (CAR '(A B C)) bize A verir (CAR '((A B) C D)) bize '(A B) verir CDR liste cinsinden parametre alır, listenin ilk elemanı dışındakileri liste olarak verir Ör: (CDR '(A B C)) bize '(B C)verir (CDR '((A B) C D)) bize '(C D) Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ

26 EQ? yüklem fonksiyonu EQ? İki sembol alır, ayni iseler #T, farklı iseler #F verir ör: (EQ? 'A 'A) bize #T verir (EQ? 'A 'B) bize #F verir Not: liste ile çağrılırsa, sonuç güvenilir değil EQ? sayısal atomlarla çalışmaz Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ

27 LIST? ve NULL? Yüklem fonksiyonları
LIST? tek parametre alır, eğer parametresi liste ise #T, değilse #F verir NULL? tek parametre alır, eğer parametresi boş liste ise #T, değilse #F verir Ör: (NULL? ‘()) bize #T verir Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ

28 Örnek Scheme fonksiyonu: member
member bir atom ve bir liste alır. Eğer atom listenin üyesi ise #T, değilse #F verir. (DEFINE (member atm lis) (COND ((NULL? lis) #F) ((EQ? atm (CAR lis)) #T) ((ELSE (member atm (CDR lis))) )) Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ

29 Örnek Scheme fonksiyonu: equalsimp
equalsimp iki tane liste alır, eşitseler #T , değilseler #F verir. (DEFINE (equalsimp lis1 lis2) (COND ((NULL? lis1) (NULL? lis2)) ((NULL? lis2) #F) ((EQ? (CAR lis1) (CAR lis2)) (equalsimp(CDR lis1)(CDR lis2))) (ELSE #F) )) Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ

30 Örnek Scheme fonksiyonu: append
append iki liste alır, birleştirilmiş olarak geri verir (DEFINE (append lis1 lis2) (COND ((NULL? lis1) lis2) (ELSE (CONS (CAR lis1) (append (CDR lis1) lis2))) )) Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ

31 Scheme yapısı: LET (LET ( (name_1 expression_1) (name_2 expression_2)
... (name_n expression_n)) body ) Tüm ifadelerin değerini bul ve değişkenlere bağla, sonra gövdeyi (body) çağır Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ

32 LET örneği (DEFINE (quadratic_roots a b c) (LET ( (root_part_over_2a
(/ (SQRT (- (* b b) (* 4 a c)))(* 2 a))) (minus_b_over_2a (/ (- 0 b) (* 2 a))) (DISPLAY (+ minus_b_over_2a root_part_over_2a)) (NEWLINE) (DISPLAY (- minus_b_over_2a root_part_over_2a)) )) Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ

33 Scheme yüksek sıralı fonksiyonu
Bir fonksiyonu listenin tüm elemanlarına uygula: (DEFINE (mapcar fun lis) (COND ((NULL? lis) ()) (ELSE (CONS (fun (CAR lis)) (mapcar fun (CDR lis)))) )) Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ

34 Kod üreten fonksiyonlar
Fonksiyon önce kod üretir, sonra kodun değerini bulur EVAL foksiyonu sayesinde Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ

35 Sayılardan oluşan listeyi topla
((DEFINE (adder lis) (COND ((NULL? lis) 0) (ELSE (EVAL (CONS '+ lis))) )) Önce liste başına + operatorünü koy, sonra bu yeni listeyi EVAL kullarak çalıştır (listenin değerini bul) Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ

36 Haskell Statik etki alanı Kuvvetli tipli Tip çıkarımı
Desen eşleme (pattern matching) Saf fonksiyonel fact 0 = 1 fact n = n * fact (n – 1) fib 0 = 1 fib 1 = 1 fib (n + 2) = fib (n + 1) + fib n Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ

37 Başka örnekler fact n | n == 0 = 1 | n > 0 = n * fact(n – 1) sub n | n < 10 = 0 | n > 100 = 2 | otherwise = 1 square x = x * x Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ

38 Listeler Liste notasyonu: Elemanlar köşeli parantez içinde ör: directions = ["north", "south", "east", "west"] Uzunluk operatörü: # ör: #directions = 4 .. Operatorü ile aritmetik seriler ör: [2, 4..10] = [2, 4, 6, 8, 10] Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ

39 Listeler... Liste birleştirme operatörü: ++
CONS, CAR, CDR : operatorü ile ör: 1:[3, 5, 7]=[1, 3, 5, 7] Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ

40 Factoriyel yeniden product [] = 1 product (a:x) = a * product x
fact n = product [1..n] Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ

41 Liste kapsamlama (comprehension)
Küme notasyonu İlk 20 pozitif tamsayının karesi: [n * n | n ← [1..20]] Bir tamsayının tüm çarpanları: factors n = [i | i ← [1..(n div 2)], (n mod i) == 0] Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ

42 Quicksort sort [] = [] sort (a:x) = sort [b | b ← x; b <= a] ++
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ

43 Tembel hesaplama (lazy evaluation)
Bir dil eğer tüm fonksiyon parametrelerinin tamamen hesplanmasını gerektiriyorsa, bu dile sıkı (strict) denir. Aksi halde dile gevşek (nonstrict) denir. Gevşek diller daha verimlidirler ve sonsuz listelere olanak tanırlar. Tembel hesaplama: Sadece ihtiyacın olan ifadelerin değerini bul. Pozitif sayılar positives = [0..] 16 tam karemidir? member b [] = False member b(a:x) = (a == b)||member b x squares = [n * n | n ← [0..]] member 16 squares Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ

44 Member yeniden member eğer aradığımız eleman listedeyse çalışır. Aksi hade sonsuza kadar gider. Aşağıdaki fonksiyonun öyle bir sorunu yok. member2 n (m:x) | m < n = member2 n x | m == n = True | otherwise = False Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ

45 Fonksiyonel dillerin uygulama alanları
LISP, Haskell vs. yapay zekada kullanılır Biigi temsiliyeti (knowledge representation) Makine öğrenmesi (machine learning) Doğal dil işleme (natural language processing) Konuşma ve görme modellemesi Scheme bazı üniversitelerde programlamaya giriş dersi olarak kullanılır Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ

46 Fonksiyonel ve komut dillerinin karşılaştırması
Verimli çalışma Karmaşık semantik Karmaşık sentaks Paralellik programcının sorumluluğunda Fonksiyonel diller: Verimsiz çalışma Basit semantik Basit sentaks Programlar otomatik olarak paralel hale getirilebilir Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ

47 Özet Fonksiyonel diller, değişkenler, atamalar ve döngüler gibi komut dillerine ait yapılar yerine, fonksiyon uygulaması, şartlı ifadeler, özyineleme ve yüksek seviyeli fonksiyonlar kullanırlar LISP önceleri saf bir fonksiyonel dil olarak başladı ama sonraları komut dilleri yapıları dahil edildi Scheme sadece statik etki alanı kullanan bir LISP lehçesidir Haskell sonsuz listeleri ve küme kapsamlarını (list comprehension) destekleyen tembel bir fonksiyonel dildir Saf fonksiyonel dillerin komutlu dillere göre avantajları vardır ama komutlu dillere göre varolan bilgisayar mimarileri üzerinde daha yavaş çalıştıklarından çok yaygın kullanıma ulaşmadılar Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ


"Fonksiyonel Programlama Dilleri" indir ppt

Benzer bir sunumlar


Google Reklamları