Sunuyu indir
Sunum yükleniyor. Lütfen bekleyiniz
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Ü
Benzer bir sunumlar
© 2024 SlidePlayer.biz.tr Inc.
All rights reserved.