Fonksiyonel Programlama - Hızlı Kılavuz

Fonksiyonel programlama dilleri, sembolik hesaplamayı işlemek ve işleme uygulamalarını listelemek için özel olarak tasarlanmıştır. Fonksiyonel programlama matematiksel fonksiyonlara dayanır. Popüler işlevsel programlama dillerinden bazıları şunlardır: Lisp, Python, Erlang, Haskell, Clojure, vb.

Fonksiyonel programlama dilleri iki gruba ayrılmıştır, yani -

  • Pure Functional Languages- Bu tür işlevsel diller yalnızca işlevsel paradigmaları destekler. Örneğin - Haskell.

  • Impure Functional Languages- Bu tür işlevsel diller, işlevsel paradigmaları ve zorunlu stil programlamayı destekler. Örneğin - LISP.

Fonksiyonel Programlama - Özellikler

Fonksiyonel programlamanın en belirgin özellikleri aşağıdaki gibidir -

  • İşlevsel programlama dilleri, hesaplamayı gerçekleştirmek için koşullu ifadeler ve özyineleme kullanan matematiksel işlevler kavramı üzerine tasarlanmıştır.

  • Fonksiyonel programlama destekleri higher-order functions ve lazy evaluation özellikleri.

  • İşlevsel programlama dilleri, döngü deyimleri gibi akış denetimlerini ve If-Else ve Switch İfadeleri gibi koşullu ifadeleri desteklemez. Doğrudan işlevleri ve işlevsel çağrıları kullanırlar.

  • OOP gibi, işlevsel programlama dilleri Soyutlama, Kapsülleme, Kalıtım ve Çok Biçimlilik gibi popüler kavramları destekler.

Fonksiyonel Programlama - Avantajlar

Fonksiyonel programlama aşağıdaki avantajları sunar -

  • Bugs-Free Code - Fonksiyonel programlama desteklemiyor stateyani yan etki sonucu yoktur ve hatasız kodlar yazabiliriz.

  • Efficient Parallel Programming- İşlevsel programlama dillerinin HİÇBİR Değişken durumu vardır, bu nedenle durum değiştirme sorunları yoktur. "Fonksiyonlar", "talimatlar" olarak paralel çalışmak üzere programlanabilir. Bu tür kodlar, kolay yeniden kullanılabilirliği ve test edilebilirliği destekler.

  • Efficiency- Fonksiyonel programlar, aynı anda çalışabilen bağımsız birimlerden oluşur. Sonuç olarak, bu tür programlar daha verimlidir.

  • Supports Nested Functions - İşlevsel programlama, Yuvalanmış İşlevleri destekler.

  • Lazy Evaluation - Fonksiyonel programlama, Tembel Listeler, Tembel Haritalar vb. Gibi Tembel Fonksiyonel Yapıları destekler.

Bir dezavantaj olarak, işlevsel programlama büyük bir bellek alanı gerektirir. Durumu olmadığından, eylemleri gerçekleştirmek için her seferinde yeni nesneler oluşturmanız gerekir.

Fonksiyonel Programlama, aynı veri kümesi üzerinde çok sayıda farklı işlem gerçekleştirmemiz gereken durumlarda kullanılır.

  • Lisp, Makine öğrenimi, dil işleme, Konuşma ve vizyonun modellenmesi gibi yapay zeka uygulamaları için kullanılır.

  • Gömülü Lisp tercümanları, Emacs gibi bazı sistemlere programlanabilirlik ekler.

Fonksiyonel Programlama ve Nesne Yönelimli Programlama

Aşağıdaki tablo, fonksiyonel programlama ile nesne yönelimli programlama arasındaki temel farkları vurgulamaktadır -

Fonksiyonel Programlama OOP
Değişmez verileri kullanır. Değişken verileri kullanır.
Bildirime Dayalı Programlama Modelini İzler. Zorunlu Programlama Modelini izler.
Odak noktası: "Ne yapıyorsun" "Nasılsınız" a odaklanın
Paralel Programlamayı Destekler Paralel Programlamaya uygun değil
İşlevlerinin yan etkisi yoktur Yöntemleri ciddi yan etkilere neden olabilir.
Akış Kontrolü, özyinelemeli işlev çağrıları ve işlev çağrıları kullanılarak yapılır Akış kontrolü, döngüler ve koşullu ifadeler kullanılarak yapılır.
Toplama Verilerini yinelemek için "Özyineleme" kavramını kullanır. Toplama Verilerini yinelemek için "Döngü" kavramını kullanır. Örneğin: Java'daki her döngü için
İfadelerin icra sırası o kadar önemli değil. İfadelerin uygulanma sırası çok önemlidir.
Hem "Veri Üzerinden Soyutlamayı" hem de "Davranış Üzerinden Soyutlamayı" destekler. Yalnızca "Veri Üzerinden Soyutlamayı" destekler.

Bir Program Kodunun Etkinliği

Bir programlama kodunun verimliliği, algoritmik verimlilik ve yürütme hızı ile doğru orantılıdır. İyi verimlilik, daha yüksek performans sağlar.

Bir programın verimliliğini etkileyen faktörler şunları içerir:

  • Makinenin hızı
  • Derleyici hızı
  • İşletim sistemi
  • Doğru Programlama dilini seçmek
  • Bir programdaki verilerin yolu düzenlenir
  • Sorunu çözmek için kullanılan algoritma

Bir programlama dilinin verimliliği aşağıdaki görevleri gerçekleştirerek iyileştirilebilir -

  • Gereksiz kodu veya gereksiz işlemeye giden kodu kaldırarak.

  • Optimum bellek ve kalıcı depolamadan yararlanarak

  • Mümkün olan her yerde yeniden kullanılabilir bileşenleri kullanarak.

  • Programın tüm katmanlarında hata ve istisna işlemeyi kullanarak.

  • Veri bütünlüğünü ve tutarlılığını sağlayan programlama kodu oluşturarak.

  • Tasarım mantığı ve akışıyla uyumlu program kodunu geliştirerek.

Verimli bir programlama kodu, kaynak tüketimini ve tamamlanma süresini mümkün olduğunca azaltabilir ve işletim ortamı için minimum risk oluşturabilir.

Programlama açısından, a functionbelirli bir görevi yerine getiren bir ifade bloğudur. İşlevler verileri kabul eder, işler ve bir sonuç döndürür. Fonksiyonlar, öncelikle yeniden kullanılabilirlik kavramını desteklemek için yazılmıştır. Bir fonksiyon bir kez yazıldığında, aynı kodu tekrar tekrar yazmak zorunda kalmadan kolayca çağrılabilir.

Farklı işlevsel diller, bir işlevi yazmak için farklı sözdizimi kullanır.

Bir Fonksiyon Yazmak İçin Ön Koşullar

Bir fonksiyon yazmadan önce, bir programcı aşağıdaki noktaları bilmelidir -

  • Fonksiyonun amacı programcı tarafından bilinmelidir.

  • Fonksiyonun algoritması programcı tarafından bilinmelidir.

  • Fonksiyonlar veri değişkenleri ve hedefleri programcı tarafından bilinmelidir.

  • İşlev verileri, kullanıcı tarafından çağrılan programcı tarafından bilinmelidir.

Bir Fonksiyonun Akış Kontrolü

Bir işlev "çağrıldığında", program işlevi yürütmek için denetimi "aktarır" ve "denetim akışı" aşağıdaki gibidir -

  • Program, bir "fonksiyon çağrısı" içeren ifadeye ulaşır.

  • Fonksiyonun içindeki ilk satır yürütülür.

  • Fonksiyonun içindeki tüm ifadeler yukarıdan aşağıya doğru yürütülür.

  • İşlev başarıyla yürütüldüğünde, kontrol başladığı ifadeye geri döner.

  • İşlev tarafından hesaplanan ve döndürülen herhangi bir veri, orijinal kod satırında işlevin yerine kullanılır.

Bir Fonksiyonun Sözdizimi

Bir fonksiyonun genel sözdizimi aşağıdaki gibidir -

returnType functionName(type1 argument1, type2 argument2, . . . ) {     
   // function body 
}

C ++ 'da bir Fonksiyon Tanımlama

Nesne yönelimli bir programlama dili olan C ++ 'da bir fonksiyonun nasıl tanımlanabileceğini anlamak için bir örnek alalım. Aşağıdaki kod, iki sayı ekleyen ve sonucunu çıktı olarak veren bir işleve sahiptir.

#include <stdio.h> 

int addNum(int a, int b);     // function prototype  

int main() {    
   int sum; 
   sum = addNum(5,6);         // function call 
   printf("sum = %d",sum); 
   return 0; 
}  
int addNum (int a,int b) {    // function definition      
   int result; 
   result = a + b; 
   return result;             // return statement 
}

Aşağıdaki çıktıyı üretecektir -

Sum = 11

Erlang'da bir Fonksiyon Tanımlama

İşlevsel bir programlama dili olan Erlang'da aynı işlevin nasıl tanımlanabileceğini görelim.

-module(helloworld).  
-export([add/2,start/0]).   

add(A,B) ->
   C = A + B,  
   io:fwrite("~w~n",[C]).  
start() ->  
   add(5,6).

Aşağıdaki çıktıyı üretecektir -

11

İşlev Prototipi

Bir işlev prototipi, işlevin dönüş türünü, işlev adını ve bağımsız değişkenler listesini içeren bir bildirisidir. İşlev gövdesi olmayan işlev tanımına benzer.

For Example - Bazı programlama dilleri işlev prototiplemeyi destekler ve bazıları desteklemez.

C ++ 'da,' sum 'fonksiyonunun fonksiyon prototipini şöyle yapabiliriz -

int sum(int a, int b)

Note - Python, Erlang, vb. Gibi programlama dilleri işlev prototiplemeyi desteklemez, tam işlevi bildirmemiz gerekir.

İşlev prototipinin kullanımı nedir?

İşlev prototipi, işlev çağrıldığında derleyici tarafından kullanılır. Derleyici, doğru dönüş türünü, uygun bağımsız değişkenler listesinin iletildiğinden ve dönüş türünün doğru olduğundan emin olmak için kullanır.

İşlev İmzası

Bir işlev imzası, parametre sayısının, parametrelerin veri türünün ve görünüm sırasının benzer sırada olması gereken işlev prototipine benzer. Örneğin -

void Sum(int a, int b, int c);         // function 1  
void Sum(float a, float b, float c);   // function 2  
void Sum(float a, float b, float c);   // function 3

Function1 ve Function2'nin farklı imzaları vardır. Function2 ve Function3 aynı imzalara sahiptir.

Note - Sonraki bölümlerde tartışacağımız işlev aşırı yükleme ve İşlev geçersiz kılma, işlev imzaları kavramına dayanmaktadır.

  • Bir sınıfın aynı ada ancak farklı imzalara sahip birden çok işlevi olduğunda işlev aşırı yüklemesi mümkündür.

  • Türetilmiş bir sınıf işlevi, temel sınıfıyla aynı ada ve imzaya sahip olduğunda işlev geçersiz kılma mümkündür.

Fonksiyonlar iki türdendir -

  • Önceden tanımlanmış işlevler
  • Kullanıcı tanımlı işlevler

Bu bölümde, fonksiyonlar hakkında detaylı olarak tartışacağız.

Önceden Tanımlanmış İşlevler

Bunlar, işlemleri gerçekleştirmek için Dilde yerleşik olan ve Standart İşlev Kitaplığı'nda saklanan işlevlerdir.

For Example - C ++ 'da' Strcat 've Haskell'de' concat 'iki dizgeyi eklemek için kullanılır, C ++' da 'strlen' ve Python'da 'len' dizi uzunluğunu hesaplamak için kullanılır.

C ++ dizesi uzunluğunu yazdırmak için program

Aşağıdaki program, C ++ kullanarak bir dizenin uzunluğunu nasıl yazdırabileceğinizi gösterir -

#include <iostream> 
#include <string.h> 
#include <stdio.h> 
using namespace std;  

int main() {     
   char str[20] = "Hello World"; 
   int len; 
   len = strlen(str); 
   cout<<"String length is: "<<len; 
   return 0; 
}

Aşağıdaki çıktıyı üretecektir -

String length is: 11

Python'da dize uzunluğunu yazdırmak için program

Aşağıdaki program, işlevsel bir programlama dili olan Python kullanarak bir dizenin uzunluğunun nasıl yazdırılacağını gösterir -

str = "Hello World"; 
print("String length is: ", len(str))

Aşağıdaki çıktıyı üretecektir -

('String length is: ', 11)

Kullanıcı Tanımlı İşlevler

Kullanıcı tanımlı işlevler, belirli görevleri gerçekleştirmek için kullanıcı tarafından tanımlanır. Bir işlevi tanımlamak için dört farklı model vardır -

  • Bağımsız değişken ve dönüş değeri olmayan işlevler
  • Bağımsız değişken içermeyen ancak dönüş değeri olan işlevler
  • Bağımsız değişkenli ancak dönüş değeri olmayan işlevler
  • Bağımsız değişken ve dönüş değeri olan işlevler

Bağımsız değişken ve dönüş değeri olmayan işlevler

Aşağıdaki program, bağımsız değişken ve dönüş değeri olmayan bir işlevin nasıl tanımlanacağını gösterir. C++ -

#include <iostream> 
using namespace std; 

void function1() { 
   cout <<"Hello World"; 
}  
int main() { 
   function1(); 
   return 0; 
}

Aşağıdaki çıktıyı üretecektir -

Hello World

Aşağıdaki program, benzer bir işlevi (bağımsız değişken ve dönüş değeri yok) nasıl tanımlayabileceğinizi gösterir. Python -

def function1():    
   print ("Hello World") 
    
function1()

Aşağıdaki çıktıyı üretecektir -

Hello World

Bağımsız değişken içermeyen ancak dönüş değeri olan işlevler

Aşağıdaki program, argümansız ancak bir dönüş değeri olan bir fonksiyonun nasıl tanımlanacağını gösterir. C++ -

#include <iostream> 
using namespace std; 
string function1() { 
   return("Hello World"); 
}  

int main() { 
   cout<<function1(); 
   return 0; 
}

Aşağıdaki çıktıyı üretecektir -

Hello World

Aşağıdaki program, benzer bir işlevi (bağımsız değişken olmadan ancak dönüş değeri ile) nasıl tanımlayabileceğinizi gösterir. Python -

def function1(): 
   return "Hello World" 
res = function1() 
print(res)

Aşağıdaki çıktıyı üretecektir -

Hello World

Bağımsız değişkenli ancak dönüş değeri olmayan işlevler

Aşağıdaki program, bağımsız değişkenle bir işlevin nasıl tanımlanacağını ancak içinde dönüş değeri olmadığını gösterir C++ -

#include <iostream> 
using namespace std; 
void function1(int x, int y) {    
   int c; 
   c = x+y;  
   cout<<"Sum is: "<<c; 
}  

int main() { 
   function1(4,5); 
   return 0; 
}

Aşağıdaki çıktıyı üretecektir -

Sum is: 9

Aşağıdaki program, benzer bir işlevi nasıl tanımlayabileceğinizi gösterir. Python -

def function1(x,y): 
   c = x + y 
   print("Sum is:",c) 
function1(4,5)

Aşağıdaki çıktıyı üretecektir -

('Sum is:', 9)

Bağımsız değişken ve dönüş değeri olan işlevler

Aşağıdaki program, bağımsız değişken olmadan ancak dönüş değeri ile C ++ 'da bir işlevin nasıl tanımlanacağını gösterir -

#include <iostream> 
using namespace std; 
int function1(int x, int y) {    
   int c; 
   c = x + y;  
   return c;    
} 

int main() {  
   int res; 
   res = function1(4,5); 
   cout<<"Sum is: "<<res; 
   return 0; 
}

Aşağıdaki çıktıyı üretecektir -

Sum is: 9

Aşağıdaki program, benzer bir işlevin (bağımsız değişken ve dönüş değeri ile) nasıl tanımlanacağını gösterir. Python -

def function1(x,y): 
   c = x + y 
   return c  

res = function1(4,5) 
print("Sum is ",res)

Aşağıdaki çıktıyı üretecektir -

('Sum is ', 9)

Bir işlevi tanımladıktan sonra, istenen çıktıyı elde etmek için ona argümanlar iletmemiz gerekir. Çoğu programlama dili desteklenircall by value ve call by reference argümanları işlevlere geçirme yöntemleri.

Bu bölümde, C ++ gibi nesne yönelimli bir programlama dilinde ve Python gibi işlevsel bir programlama dilinde "değere göre arama" nın çalıştığını öğreneceğiz.

Değere Göre Çağırma yönteminde, original value cannot be changed. Bir işleve bir argüman ilettiğimizde, yığın belleğindeki işlev parametresi tarafından yerel olarak saklanır. Bu nedenle, değerler yalnızca işlev içinde değiştirilir ve işlev dışında bir etkisi olmayacaktır.

C ++ 'da Değere Göre Çağrı

Aşağıdaki program Call by Value'nun C ++ 'da nasıl çalıştığını gösterir -

#include <iostream> 
using namespace std; 

void swap(int a, int b) {    
   int temp; 
   temp = a; 
   a = b; 
   b = temp; 
   cout<<"\n"<<"value of a inside the function: "<<a; 
   cout<<"\n"<<"value of b inside the function: "<<b; 
}  
int main() {     
   int a = 50, b = 70;   
   cout<<"value of a before sending to function: "<<a; 
   cout<<"\n"<<"value of b before sending to function: "<<b; 
   swap(a, b);  // passing value to function 
   cout<<"\n"<<"value of a after sending to function: "<<a; 
   cout<<"\n"<<"value of b after sending to function: "<<b; 
   return 0;   
}

Aşağıdaki çıktıyı üretecektir -

value of a before sending to function:  50 
value of b before sending to function:  70 
value of a inside the function:  70 
value of b inside the function:  50 
value of a after sending to function:  50 
value of b after sending to function:  70

Python'da Değere Göre Arama

Aşağıdaki program, Değere Göre Çağırmanın Python'da nasıl çalıştığını gösterir -

def swap(a,b): 
   t = a; 
   a = b; 
   b = t; 
   print "value of a inside the function: :",a 
   print "value of b inside the function: ",b 

# Now we can call the swap function 
a = 50 
b = 75 
print "value of a before sending to function: ",a 
print "value of b before sending to function: ",b 
swap(a,b) 
print "value of a after sending to function: ", a 
print "value of b after sending to function: ",b

Aşağıdaki çıktıyı üretecektir -

value of a before sending to function:  50 
value of b before sending to function:  75 
value of a inside the function: : 75 
value of b inside the function:  50 
value of a after sending to function:  50 
value of b after sending to function:  75

Referansla Çağrıda, original value is changedçünkü argümanların referans adresini iletiyoruz. Gerçek ve biçimsel argümanlar aynı adres alanını paylaşır, böylece işlevin içindeki herhangi bir değer değişikliği, işlevin içinde olduğu kadar dışında da yansıtılır.

C ++ 'da Referansla Çağrı

Aşağıdaki program Call by Value'nun C ++ 'da nasıl çalıştığını gösterir -

#include <iostream> 
using namespace std; 

void swap(int *a, int *b) {    
   int temp; 
   temp = *a; 
   *a = *b; 
   *b = temp; 
   cout<<"\n"<<"value of a inside the function: "<<*a; 
   cout<<"\n"<<"value of b inside the function: "<<*b; 
}  
int main() {     
   int a = 50, b = 75;   
   cout<<"\n"<<"value of a before sending to function: "<<a; 
   cout<<"\n"<<"value of b before sending to function: "<<b; 
   swap(&a, &b);  // passing value to function 
   cout<<"\n"<<"value of a after sending to function: "<<a; 
   cout<<"\n"<<"value of b after sending to function: "<<b; 
   return 0;   
}

Aşağıdaki çıktıyı üretecektir -

value of a before sending to function:  50 
value of b before sending to function:  75 
value of a inside the function:  75 
value of b inside the function: 50 
value of a after sending to function:  75 
value of b after sending to function:  50

Python'da Referansla Çağrı

Aşağıdaki program, Değere Göre Çağırmanın Python'da nasıl çalıştığını gösterir -

def swap(a,b): 
   t = a; 
   a = b; 
   b = t; 
   print "value of a inside the function: :",a 
   print "value of b inside the function: ",b 
   return(a,b) 
    
# Now we can call swap function 
a = 50 
b =75 
print "value of a before sending to function: ",a 
print "value of b before sending to function: ",b 
x = swap(a,b) 
print "value of a after sending to function: ", x[0] 
print "value of b after sending to function: ",x[1]

Aşağıdaki çıktıyı üretecektir -

value of a before sending to function:  50 
value of b before sending to function:  75 
value of a inside the function:  75 
value of b inside the function:  50 
value of a after sending to function:  75 
value of b after sending to function:  50

Aynı isimde ancak farklı parametrelere sahip birden fazla fonksiyonumuz olduğunda, bunların aşırı yüklenmiş olduğu söylenir. Bu teknik, programın okunabilirliğini artırmak için kullanılır.

Bir işlevi aşırı yüklemenin iki yolu vardır, yani -

  • Farklı sayıda argümana sahip olmak
  • Farklı argüman türlerine sahip olmak

Fonksiyon aşırı yüklemesi normalde farklı sayıda veya türde argümanlarla tek bir işlem gerçekleştirmemiz gerektiğinde yapılır.

C ++ 'da Fonksiyon Aşırı Yüklemesi

Aşağıdaki örnek, nesne yönelimli bir programlama dili olan C ++ 'da işlev aşırı yüklemesinin nasıl yapıldığını gösterir -

#include <iostream> 
using namespace std;  
void addnum(int,int); 
void addnum(int,int,int); 

int main() {     
   addnum (5,5); 
   addnum (5,2,8); 
   return 0; 
} 

void addnum (int x, int y) {     
   cout<<"Integer number: "<<x+y<<endl; 
} 

void addnum (int x, int y, int z) {     
   cout<<"Float number: "<<x+y+z<<endl; 
}

Aşağıdaki çıktıyı üretecektir -

Integer number: 10 
Float number: 15

Erlang'da Fonksiyon Aşırı Yüklemesi

Aşağıdaki örnek, işlevsel bir programlama dili olan Erlang'da işlev aşırı yüklemesinin nasıl gerçekleştirileceğini gösterir -

-module(helloworld).  
-export([addnum/2,addnum/3,start/0]).   

addnum(X,Y) ->  
   Z = X+Y,  
   io:fwrite("~w~n",[Z]).  
    
addnum(X,Y,Z) ->  
   A = X+Y+Z,  
   io:fwrite("~w~n",[A]).  
  
start() ->
   addnum(5,5),     addnum(5,2,8).

Aşağıdaki çıktıyı üretecektir -

10 
15

Temel sınıf ve türetilmiş sınıf tam olarak aynı ada, aynı dönüş türüne ve aynı argümanlar listesine sahip üye işlevlere sahip olduğunda, bunun işlev geçersiz kıldığı söylenir.

C ++ kullanarak Fonksiyonu Geçersiz Kılma

Aşağıdaki örnek, nesne tabanlı bir programlama dili olan C ++ 'da işlev geçersiz kılmanın nasıl yapıldığını gösterir -

#include <iostream> 
using namespace std;  

class A {  
   public: 
   void display() {   
      cout<<"Base class"; 
   } 
}; 

class B:public A {  
   public: 
   void display() {   
      cout<<"Derived Class"; 
   } 
}; 

int main() {  
   B obj; 
   obj.display(); 
   return 0;  
}

Aşağıdaki çıktıyı üretecek

Derived Class

Python kullanarak Fonksiyonu Geçersiz Kılma

Aşağıdaki örnek, işlevsel bir programlama dili olan Python'da işlev geçersiz kılmanın nasıl gerçekleştirileceğini gösterir -

class A(object): 
   def disp(self): 
      print "Base Class"  
class B(A): 
   def disp(self): 
      print "Derived Class"  
x = A() 
y = B()  
x.disp() 
y.disp()

Aşağıdaki çıktıyı üretecektir -

Base Class 
Derived Class

Kendini çağıran bir işlev özyinelemeli işlev olarak bilinir ve bu teknik özyineleme olarak bilinir. Bir özyineleme talimatı, başka bir talimat onu engelleyene kadar devam eder.

C ++ 'da özyineleme

Aşağıdaki örnek, nesne yönelimli bir programlama dili olan C ++ 'da özyinelemenin nasıl çalıştığını gösterir -

#include <stdio.h> 
long int fact(int n);  

int main() { 
   int n; 
   printf("Enter a positive integer: "); 
   scanf("%d", &n); 
   printf("Factorial of %d = %ld", n, fact(n)); 
   return 0; 
} 
long int fact(int n) { 
   if (n >= 1) 
      return n*fact(n-1); 
   else 
      return 1; 
}

Aşağıdaki çıktıyı üretecek

Enter a positive integer: 5 
Factorial of 5 = 120

Python'da Özyineleme

Aşağıdaki örnek, işlevsel bir programlama dili olan Python'da özyinelemenin nasıl çalıştığını gösterir -

def fact(n): 
   if n == 1: 
      return n 
   else: 
      return n* fact (n-1)  

# accepts input from user 
num = int(input("Enter a number: "))  
# check whether number is positive or not 

if num < 0: 
   print("Sorry, factorial does not exist for negative numbers") 
else: 
   print("The factorial of " + str(num) +  " is " + str(fact(num)))

Aşağıdaki çıktıyı üretecektir -

Enter a number: 6
The factorial of 6 is 720

Daha yüksek dereceli bir işlev (HOF), aşağıdaki koşullardan en az birini izleyen bir işlevdir -

  • Bağımsız değişken olarak veya daha fazla işlevi alır
  • Sonuç olarak bir işlevi döndürür

PHP'de HOF

Aşağıdaki örnek, nesne yönelimli bir programlama dili olan PHP'de daha yüksek dereceden bir işlevin nasıl yazılacağını gösterir -

<?php  
$twice = function($f, $v) { return $f($f($v)); 
};  

$f = function($v) { 
   return $v + 3; }; echo($twice($f, 7));

Aşağıdaki çıktıyı üretecektir -

13

Python'da HOF

Aşağıdaki örnek, nesne yönelimli bir programlama dili olan Python'da daha yüksek dereceden bir işlevin nasıl yazılacağını gösterir -

def twice(function): 
   return lambda x: function(function(x))  
def f(x): 
   return x + 3 
g = twice(f)
print g(7)

Aşağıdaki çıktıyı üretecektir -

13

Veri türü, bir nesnenin sahip olabileceği değer türünü ve üzerinde hangi işlemlerin gerçekleştirilebileceğini tanımlar. Kullanılmadan önce bir veri türü bildirilmelidir. Farklı programlama dilleri farklı veri türlerini destekler. Örneğin,

  • C char, int, float, long vb. Destekler.
  • Python; String, List, Tuple vb. Destekler.

Geniş anlamda, üç tür veri türü vardır -

  • Fundamental data types- Bunlar, programcı tarafından gereksinime göre yalnızca bir değeri saklamak için doğrudan kullanılan önceden tanımlanmış veri türleridir, yani tamsayı türü, karakter türü veya kayan tür. Örneğin - int, char, float vb.

  • Derived data types- Bu veri türleri, programcı tarafından gereksinimlerine göre aynı türden birden çok değeri depolamak için tasarlanan yerleşik veri türü kullanılarak türetilir. Örneğin - Dizi, İşaretçi, işlev, liste vb.

  • User-defined data types- Bu veri türleri, ihtiyaca göre aynı türde veya farklı türde birden çok değeri veya her ikisini birden depolamak için tek bir veri türüne sarılmış yerleşik veri türleri kullanılarak türetilir. Örneğin - Sınıf, Yapı vb.

C ++ Tarafından Desteklenen Veri Türleri

Aşağıdaki tablo C ++ tarafından desteklenen veri türlerini listeler -

Veri tipi Boyut Aralık
kömür 1 bayt -128 ila 127 veya 0 ila 255
imzasız karakter 1 bayt 0 ile 255
imzalı karakter 1 bayt -128 ila 127
int 4 bayt -2147483648 ile 2147483647
imzasız int 4 bayt 0 ila 4294967295
imzalı int 4 bayt -2147483648 ile 2147483647
kısa int 2 bayt -32768 ila 32767
işaretsiz kısa int 2 bayt 0 ile 65.535
kısa int imzalı 2 bayt -32768 ila 32767
uzun int 4 bayt -2.147.483.648 ile 2.147.483.647
uzun int imzalı 4 bayt -2.147.483.648 ile 2.147.483.647
işaretsiz uzun int 4 bayt 0 ile 4.294.967.295
yüzen 4 bayt +/- 3.4e +/- 38 (~ 7 basamak)
çift 8 bayt +/- 1.7e +/- 308 (~ 15 basamak)
uzun çift 8 bayt +/- 1.7e +/- 308 (~ 15 basamak)

Java Tarafından Desteklenen Veri Türleri

Aşağıdaki veri türleri Java tarafından desteklenmektedir -

Veri tipi Boyut Aralık
bayt 1 bayt -128 ila 127
kömür 2 bayt 0 ile 65.536
kısa 2 bayt -32.7688 ile 32.767
int 4 bayt -2.147.483.648 ile 2.147.483.647
uzun 8 bayt -9,223,372,036,854,775,808 ile 9,223,372,036,854,775,807
yüzen 4 bayt -2147483648 ile 2147483647
çift 8 bayt + 9.223 * 1018
Boole 1 bit Doğru ya da yanlış

Erlang Tarafından Desteklenen Veri Türleri

Bu bölümde işlevsel bir programlama dili olan Erlang'ın desteklediği veri türlerini tartışacağız.

Numara

Erlang iki tür sayısal değişmezi destekler, yani integer ve float. İki tam sayı değerinin nasıl ekleneceğini gösteren aşağıdaki örneğe bir göz atın -

-module(helloworld).
-export([start/0]). 
start() -> 
   io:fwrite("~w",[5+4]).

Aşağıdaki çıktıyı üretecek -

9

Atom

Bir atomdeğeri değiştirilemeyen bir dizedir. Küçük harfle başlamalıdır ve alfanümerik karakterleri ve özel karakterleri içerebilir. Bir atom özel karakterler içerdiğinde, tek tırnak (') içine alınmalıdır. Daha iyi anlamak için aşağıdaki örneğe bir göz atın.

-module(helloworld). 
-export([start/0]). 

start()-> 
   io:fwrite(monday).

Aşağıdaki çıktıyı üretecektir -

monday

Note- Atomu büyük "M" ile "Pazartesi" olarak değiştirmeyi deneyin. Program bir hata üretecektir.

Boole

Bu veri türü, sonucu şu şekilde görüntülemek için kullanılır: true veya false. Aşağıdaki örneğe bir göz atın. İki tam sayının nasıl karşılaştırılacağını gösterir.

-module(helloworld). 
-export([start/0]). 

start() -> 
   io:fwrite(5 =< 9).

Aşağıdaki çıktıyı üretecektir -

true

Bit Dizesi

Yazılmamış bellek alanını saklamak için bir bit dizisi kullanılır. Aşağıdaki örneğe bir göz atın. Bir bit dizesinin 2 bitinin listeye nasıl dönüştürüleceğini gösterir.

-module(helloworld). 
-export([start/0]). 

start() -> 
   Bin2 = <<15,25>>, 
   P = binary_to_list(Bin2), 
   io:fwrite("~w",[P]).

Aşağıdaki çıktıyı üretecektir -

[15,25]

Tuple

Demet, sabit sayıda terime sahip bileşik bir veri türüdür. Bir demetin her terimi birelement. Eleman sayısı, demetin boyutudur. Aşağıdaki örnek 5 terimden oluşan bir demetin nasıl tanımlanacağını ve boyutunu gösterir.

-module(helloworld).  
-export([start/0]).  

start() ->  
   K = {abc,50,pqr,60,{xyz,75}} ,  
   io:fwrite("~w",[tuple_size(K)]).

Aşağıdaki çıktıyı üretecektir -

5

Harita

Harita, değişken sayıda anahtar / değer ilişkisi içeren bileşik bir veri türüdür. Haritadaki her bir anahtar / değer ilişkisi birassociation-pair. key ve value çiftin parçaları denir elements. İlişki çifti sayısının haritanın boyutu olduğu söyleniyor. Aşağıdaki örnek, 3 eşlemeden oluşan bir haritanın nasıl tanımlanacağını ve boyutunun nasıl yazdırılacağını gösterir.

-module(helloworld).  
-export([start/0]).  
 
start() ->  
   Map1 = #{name => 'abc',age => 40, gender => 'M'},  
   io:fwrite("~w",[map_size(Map1)]).

Aşağıdaki çıktıyı üretecektir -

3

Liste

Liste, değişken sayıda terime sahip bileşik bir veri türüdür. Listedeki her terime bir öğe adı verilir. Eleman sayısının listenin uzunluğu olduğu söyleniyor. Aşağıdaki örnek, 5 öğeden oluşan bir listenin nasıl tanımlanacağını ve boyutunun nasıl yazdırılacağını gösterir.

-module(helloworld).  
-export([start/0]).  

start() ->  
   List1 = [10,15,20,25,30] ,  
   io:fwrite("~w",[length(List1)]).

Aşağıdaki çıktıyı üretecektir -

5

Note - 'String' veri türü Erlang'da tanımlanmadı.

Çok biçimlilik, programlama açısından, tek bir kodun birden çok kez yeniden kullanılması anlamına gelir. Daha spesifik olarak, bir programın nesneleri veri türüne veya sınıfına bağlı olarak farklı şekilde işleme yeteneğidir.

Polimorfizm iki türdendir -

  • Compile-time Polymorphism - Bu tür polimorfizm, yöntem aşırı yükleme kullanılarak elde edilebilir.

  • Run-time Polymorphism - Bu tür polimorfizm, yöntemi geçersiz kılma ve sanal işlevler kullanılarak elde edilebilir.

Polimorfizmin Avantajları

Polimorfizm aşağıdaki avantajları sunar -

  • Programcının kodları yeniden kullanmasına yardımcı olur, yani sınıflar yazıldıktan, test edildikten ve uygulandıktan sonra gerektiği gibi yeniden kullanılabilir. epeyce zaman kazandırır.

  • Birden çok veri türünü depolamak için tek değişken kullanılabilir.

  • Kodlarda hata ayıklamak kolaydır.

Polimorfik Veri Türleri

Polimorfik veri türleri, bu bellek adresinde depolanan veri türü olmadan yalnızca bir bayt adresini saklayan genel işaretçiler kullanılarak uygulanabilir. Örneğin,

function1(void *p, void *q)

nerede p ve q tutabilecek genel işaretçilerdir int, float (veya başka herhangi bir) bağımsız değişken olarak değer.

C ++ 'da Polimorfik Fonksiyon

Aşağıdaki program, nesne yönelimli bir programlama dili olan C ++ 'da polimorfik fonksiyonların nasıl kullanılacağını göstermektedir.

#include <iostream> 
Using namespace std: 

class A {  
   public: 
   void show() {    
      cout << "A class method is called/n"; 
   } 
}; 

class B:public A { 
   public: 
   void show() {   
      cout << "B class method is called/n"; 
   } 
};  

int main() {   
   A x;        // Base class object 
   B y;        // Derived class object 
   x.show();   // A class method is called 
   y.show();   // B class method is called 
   return 0; 
}

Aşağıdaki çıktıyı üretecektir -

A class method is called 
B class method is called

Python'da Polimorfik Fonksiyon

Aşağıdaki program, işlevsel bir programlama dili olan Python'da polimorfik fonksiyonların nasıl kullanılacağını göstermektedir.

class A(object): 
   def show(self): 
      print "A class method is called" 
  
class B(A): 
   def show(self): 
      print "B class method is called" 
  
def checkmethod(clasmethod): 
   clasmethod.show()  

AObj = A() 
BObj = B() 
  
checkmethod(AObj) 
checkmethod(BObj)

Aşağıdaki çıktıyı üretecektir -

A class method is called 
B class method is called

Bir stringboşluklar içeren bir karakter grubudur. NULL karakter ('\ 0') ile sonlandırılan tek boyutlu bir karakter dizisi diyebiliriz. Bir dizge ayrıca C, C ++, Java, PHP, Erlang, Haskell, Lisp vb. Programlama dillerinin çoğu tarafından desteklenen önceden tanımlanmış bir sınıf olarak da kabul edilebilir.

Aşağıdaki görüntü, "Eğitim" dizesinin bellekte nasıl görüneceğini gösterir.

C ++ 'da bir Dize Oluşturun

Aşağıdaki program, nesne yönelimli bir programlama dili olan C ++ 'da bir dizenin nasıl oluşturulacağını gösteren bir örnektir.

#include <iostream> 
using namespace std; 

int main () {    
   char greeting[20] = {'H', 'o', 'l', 'i', 'd', 'a', 'y', '\0'}; 
   cout << "Today is: "; 
   cout << greeting << endl; 
   return 0; 
}

Aşağıdaki çıktıyı üretecektir -

Today is: Holiday

Erlang dilinde dize

Aşağıdaki program, işlevsel bir programlama dili olan Erlang'da nasıl string oluşturulacağını gösteren bir örnektir.

-module(helloworld).  
-export([start/0]).   
start() -> 
   Str = "Today is: Holiday",  
   io:fwrite("~p~n",[Str]).

Aşağıdaki çıktıyı üretecektir -

"Today is: Holiday"

C ++ 'da Dize İşlemleri

Farklı programlama dilleri dizelerde farklı yöntemleri destekler. Aşağıdaki tablo, C ++ tarafından desteklenen önceden tanımlanmış birkaç dize yöntemini gösterir.

S.No. Yöntem ve Açıklama
1

Strcpy(s1,s2)

S2 dizesini s1 dizesine kopyalar

2

Strcat(s1,s2)

S1'in sonuna s2 dizgesini ekler

3

Strlen(s1)

S1 dizesinin uzunluğunu sağlar

4

Strcmp(s1,s2)

S1 ve s2 dizeleri aynı olduğunda 0 döndürür

5

Strchr(s1,ch)

S1 dizesindeki ch karakterinin ilk oluşumuna bir gösterici döndürür.

6

Strstr(s1,s2)

S1 dizgesinde s2 dizgesinin ilk oluşumuna bir gösterici döndürür.

Aşağıdaki program, yukarıdaki yöntemlerin C ++ 'da nasıl kullanılabileceğini gösterir -

#include <iostream> 
#include <cstring> 
using namespace std; 

int main () {   
   char str1[20] = "Today is "; 
   char str2[20] = "Monday"; 
   char str3[20]; 
   int  len ;  
   strcpy( str3, str1); // copy str1 into str3 
   cout << "strcpy( str3, str1) : " << str3 << endl;  

   strcat( str1, str2); // concatenates str1 and str2 
   cout << "strcat( str1, str2): " << str1 << endl;  

   len = strlen(str1);  // String length after concatenation 
   cout << "strlen(str1) : " << len << endl; 
   return 0; 
}

Aşağıdaki çıktıyı üretecektir -

strcpy(str3, str1)   :  Today is 
strcat(str1, str2)   :  Today is Monday 
strlen(str1)         :  15

Erlang'da String İşlemleri

Aşağıdaki tablo, Erlang tarafından desteklenen önceden tanımlanmış dize yöntemlerinin bir listesini gösterir.

S.No. Yöntem ve Açıklama
1

len(s1)

Verilen dizedeki karakter sayısını döndürür.

2

equal(s1,s2)

S1 ve s2 dizgeleri eşit olduğunda doğru döndürür, aksi takdirde yanlış döndürür

3

concat(s1,s2)

S1 dizesinin sonuna s2 ekler

4

str(s1,ch)

S1 dizesindeki ch karakterinin dizin konumunu döndürür

5

str (s1,s2)

S1 dizesinde s2'nin dizin konumunu döndürür

6

substr(s1,s2,num)

Bu yöntem, başlangıç ​​konumuna ve başlangıç ​​konumundan karakter sayısına bağlı olarak s1 dizesinden s2 dizesini döndürür

7

to_lower(s1)

Bu yöntem dizeyi küçük harflerle döndürür

Aşağıdaki program, yukarıdaki yöntemlerin Erlang'da nasıl kullanılabileceğini göstermektedir.

-module(helloworld).  
-import(string,[concat/2]).  
-export([start/0]).  
   start() ->  
   S1 = "Today is ",  
   S2 = "Monday",  
   S3 = concat(S1,S2),  
   io:fwrite("~p~n",[S3]).

Aşağıdaki çıktıyı üretecektir -

"Today is Monday"

Listbenzer veri öğelerinin bir koleksiyonunu depolamak için kullanılan işlevsel programlama dillerinde bulunan en çok yönlü veri türüdür. Kavram, nesne yönelimli programlamadaki dizilere benzer. Liste öğeleri, virgülle ayrılan köşeli parantez içinde yazılabilir. Bir listeye veri yazmanın yolu, dilden dile değişir.

Java'da Numaraların Listesi Oluşturma Programı

Liste, Java / C / C ++ 'da bir veri türü değildir, ancak Java'da bir liste oluşturmak için alternatif yollarımız vardır, örn. ArrayList ve LinkedList.

Aşağıdaki örnek, Java'da bir listenin nasıl oluşturulacağını gösterir. Burada, bir sayı listesi oluşturmak için bir Bağlantılı Liste yöntemi kullanıyoruz.

import java.util.*; 
import java.lang.*; 
import java.io.*;  

/* Name of the class has to be "Main" only if the class is public. */ 

public class HelloWorld { 
   public static void main (String[] args) throws java.lang.Exception { 
      List<String> listStrings = new LinkedList<String>(); 
      listStrings.add("1"); 
      listStrings.add("2"); 
      listStrings.add("3"); 
      listStrings.add("4"); 
      listStrings.add("5"); 
  
      System.out.println(listStrings); 
   } 
}

Aşağıdaki çıktıyı üretecektir -

[1, 2, 3, 4, 5]

Erlang'da Sayı Listesi Oluşturma Programı

-module(helloworld).  
-export([start/0]).   

start() ->  
   Lst = [1,2,3,4,5],  
   io:fwrite("~w~n",[Lst]).

Aşağıdaki çıktıyı üretecektir -

[1 2 3 4 5]

Java'da İşlemleri Listeleme

Bu bölümde Java'da listeler üzerinden yapılabilecek bazı işlemleri ele alacağız.

Bir Listeye Eleman Ekleme

Bir listeye eleman eklemek için add (Object), add (index, Object), addAll () yöntemleri kullanılır. Örneğin,

ListStrings.add(3, “three”)

Bir Listeden Eleman Kaldırma

Remove (dizin) veya removeobject () yöntemleri, bir listeden öğeleri kaldırmak için kullanılır. Örneğin,

ListStrings.remove(3,”three”)

Note - Listeden tüm elemanları çıkarmak için clear () yöntemi kullanılır.

Bir Listeden Eleman Alma

Get () yöntemi, belirli bir konumdaki bir listeden öğeleri almak için kullanılır. Getfirst () & getlast () yöntemleri LinkedList sınıfında kullanılabilir. Örneğin,

String str = ListStrings.get(2)

Bir Listedeki Öğeleri Güncelleme

Set (dizin, öğe) yöntemi, belirli bir dizindeki bir öğeyi belirli bir öğe ile güncellemek için kullanılır. Örneğin,

listStrings.set(2,”to”)

Bir Listedeki Öğeleri Sıralama

Collection.sort () ve collection.reverse () yöntemleri, bir listeyi artan veya azalan düzende sıralamak için kullanılır. Örneğin,

Collection.sort(listStrings)

Bir Listedeki Öğeleri Arama

Gereksinime göre aşağıdaki üç yöntem kullanılır -

Boolean contains(Object) yöntem döner true liste belirtilen öğeyi içeriyorsa, aksi takdirde döndürür false.

int indexOf(Object) yöntem, bir listedeki belirtilen öğenin ilk oluşumunun dizinini döndürür, aksi takdirde öğe bulunamadığında -1 döndürür.

int lastIndexOf(Object) Listedeki belirtilen bir elemanın son oluşumunun dizinini döndürür, aksi takdirde eleman bulunamadığında -1 döndürür.

Erlang'da İşlemleri Listele

Bu bölümde Erlang'da listeler üzerinden yapılabilecek bazı işlemleri ele alacağız.

İki liste eklemek

Append (listfirst, listsecond) yöntemi, iki liste ekleyerek yeni bir liste oluşturmak için kullanılır. Örneğin,

append(list1,list2)

Bir öğeyi silme

Delete (element, listname) yöntemi, belirtilen öğeyi listeden silmek için kullanılır ve yeni listeyi döndürür. Örneğin,

delete(5,list1)

Listeden son elemanı silme

Droplast (liste adı) yöntemi, listeden son öğeyi silmek ve yeni bir liste döndürmek için kullanılır. Örneğin,

droplast(list1)

Bir elemanı aramak

Üye (öğe, liste adı) yöntemi, öğeyi listede aramak için kullanılır, bulunursa true döndürür, aksi takdirde false döndürür. Örneğin,

member(5,list1)

Maksimum ve minimum değer elde etmek

Bir listedeki maksimum ve minimum değerleri bulmak için max (liste adı) ve min (liste adı) yöntemleri kullanılır. Örneğin,

max(list1)

Liste öğelerini sıralama

Sıralama (liste adı) ve ters (liste adı) yöntemleri, bir listeyi artan veya azalan düzende sıralamak için kullanılır. Örneğin,

sort(list1)

Liste öğeleri ekleme

Toplam (liste adı) yöntemi, bir listenin tüm öğelerini eklemek ve toplamlarını döndürmek için kullanılır. Örneğin,

sum(list1)

Java kullanarak bir listeyi artan ve azalan düzende sıralayın

Aşağıdaki program, Java kullanarak bir listenin artan ve azalan düzende nasıl sıralanacağını göstermektedir -

import java.util.*; 
import java.lang.*; 
import java.io.*;  

public class SortList { 
   public static void main (String[] args) throws java.lang.Exception { 
      List<String> list1 = new ArrayList<String>(); 
      list1.add("5"); 
      list1.add("3"); 
      list1.add("1"); 
      list1.add("4"); 
      list1.add("2"); 
  
      System.out.println("list before sorting: " + list1); 
  
      Collections.sort(list1); 
  
      System.out.println("list in ascending order: " + list1); 
      Collections.reverse(list1); 
  
      System.out.println("list in dsending order: " + list1); 
   } 
}

Aşağıdaki çıktıyı üretecektir -

list before sorting     : [5, 3, 1, 4, 2] 
list in ascending order : [1, 2, 3, 4, 5] 
list in dsending order  : [5, 4, 3, 2, 1]

Erlang kullanarak bir listeyi artan sırada sıralayın

Aşağıdaki program, işlevsel bir programlama dili olan Erlang'ı kullanarak bir listeyi artan ve azalan sırada nasıl sıralayacağınızı gösterir -

-module(helloworld).  
-import(lists,[sort/1]).  
-export([start/0]).   

start() ->  
   List1 = [5,3,4,2,1],  
   io:fwrite("~p~n",[sort(List1)]),

Aşağıdaki çıktıyı üretecektir -

[1,2,3,4,5]

Demet, sabit sayıda terime sahip bileşik bir veri türüdür. Bir demetteki her terim birelement. Eleman sayısı, demetin boyutudur.

C # 'da bir demet tanımlama programı

Aşağıdaki program, dört terimden oluşan bir demetin nasıl tanımlanacağını ve nesne yönelimli bir programlama dili olan C # kullanarak nasıl yazdırılacağını göstermektedir.

using System; 
public class Test { 
   public static void Main() { 
      var t1 = Tuple.Create(1, 2, 3, new Tuple<int, int>(4, 5));   
      Console.WriteLine("Tuple:" + t1);    
   } 
}

Aşağıdaki çıktıyı üretecektir -

Tuple :(1, 2, 3, (4, 5))

Erlang'da bir demet tanımlama programı

Aşağıdaki program, dört terimden oluşan bir demetinin nasıl tanımlanacağını ve işlevsel bir programlama dili olan Erlang kullanılarak nasıl yazdırılacağını göstermektedir.

-module(helloworld).  
-export([start/0]).   

start() -> 
   P = {1,2,3,{4,5}} ,  
   io:fwrite("~w",[P]).

Aşağıdaki çıktıyı üretecektir -

{1, 2, 3, {4, 5}}

Tuple'ın Avantajları

Tuples aşağıdaki avantajları sunar -

  • Tuple'lar doğası gereği cezalı boyuttadır, yani bir demetten eleman ekleyemeyiz / silemeyiz.

  • Bir demetteki herhangi bir elemanı arayabiliriz.

  • Tuplelar, listelerden daha hızlıdır çünkü sabit bir değer kümesine sahiptirler.

  • Tuples, dizeler, sayılar vb. Gibi değişmez değerler içerdikleri için sözlük anahtarları olarak kullanılabilir.

Tuples vs Listeler

Tuple Liste
Tuple'lar immutableyani, verilerini güncelleyemiyoruz. Liste mutableyani verilerini güncelleyebiliriz.
Bir demetteki öğeler farklı türde olabilir. Bir listedeki tüm öğeler aynı türdendir.
Tuple'lar, öğelerin etrafındaki yuvarlak parantez ile gösterilir. Listeler, öğelerin etrafındaki köşeli parantezlerle gösterilir.

Tuples üzerinde İşlemler

Bu bölümde, bir demet üzerinde gerçekleştirilebilecek birkaç işlemi tartışacağız.

Girilen bir değerin Tuple olup olmadığını kontrol edin

Yöntem is_tuple(tuplevalues)eklenen bir değerin bir demet olup olmadığını belirlemek için kullanılır. Dönertrue eklenen bir değer bir demet olduğunda, aksi takdirde geri döner false. Örneğin,

-module(helloworld).  
-export([start/0]).  

start() ->  
   K = {abc,50,pqr,60,{xyz,75}} , io:fwrite("~w",[is_tuple(K)]).

Aşağıdaki çıktıyı üretecektir -

True

Bir Listeyi Tuple'a Dönüştürme

Yöntem list_to_tuple(listvalues)bir listeyi bir demete dönüştürür. Örneğin,

-module(helloworld).  
-export([start/0]).  

start() ->  
   io:fwrite("~w",[list_to_tuple([1,2,3,4,5])]).

Aşağıdaki çıktıyı üretecektir -

{1, 2, 3, 4, 5}

Bir Demeti Listeye Dönüştürme

Yöntem tuple_to_list(tuplevalues)belirli bir demeti liste biçimine dönüştürür. Örneğin,

-module(helloworld).  
-export([start/0]).  

start() ->  
   io:fwrite("~w",[tuple_to_list({1,2,3,4,5})]).

Aşağıdaki çıktıyı üretecektir -

[1, 2, 3, 4, 5]

Tuple boyutunu kontrol edin

Yöntem tuple_size(tuplename)bir demetin boyutunu döndürür. Örneğin,

-module(helloworld).  
-export([start/0]).  

start() ->  
   K = {abc,50,pqr,60,{xyz,75}} ,  
   io:fwrite("~w",[tuple_size(K)]).

Aşağıdaki çıktıyı üretecektir -

5

Kayıt, sabit sayıda elemanı depolamak için bir veri yapısıdır. C dilindeki bir yapıya benzer. Derleme sırasında, ifadeleri tuple ifadelerine çevrilir.

Kayıt nasıl oluşturulur?

'Kayıt' anahtar sözcüğü, kayıt adı ve alanlarıyla belirtilen kayıtları oluşturmak için kullanılır. Sözdizimi aşağıdaki gibidir -

record(recodname, {field1, field2, . . fieldn})

Kayda değer eklemek için sözdizimi şöyledir:

#recordname {fieldName1 = value1, fieldName2 = value2 .. fieldNamen = valuen}

Erlang kullanarak kayıt oluşturma programı

Aşağıdaki örnekte, bir isim kaydı oluşturduk student iki alana sahip olmak, yani sname ve sid.

-module(helloworld).  
-export([start/0]).  
-record(student, {sname = "", sid}).   

start() ->  
   S = #student{sname = "Sachin",sid = 5}.

C ++ kullanarak kayıt oluşturma programı

Aşağıdaki örnek, nesne yönelimli bir programlama dili olan C ++ kullanılarak kayıtların nasıl oluşturulacağını gösterir -

#include<iostream> 
#include<string>
using namespace std; 

class student {
   public: 
   string sname; 
   int sid; 
   15 
}; 

int main() {    
   student S;  
   S.sname = "Sachin"; 
   S.sid = 5; 
   return 0;  
}

Erlang kullanarak kayıt değerlerine erişim programı

Aşağıdaki program, işlevsel bir programlama dili olan Erlang kullanarak kayıt değerlerine nasıl erişildiğini gösterir -

-module(helloworld).  
-export([start/0]).  
-record(student, {sname = "", sid}).   

start() ->  
   S = #student{sname = "Sachin",sid = 5},  
   io:fwrite("~p~n",[S#student.sid]),  
   io:fwrite("~p~n",[S#student.sname]).

Aşağıdaki çıktıyı üretecektir -

5 
"Sachin"

C ++ kullanarak kayıt değerlerine erişim programı

Aşağıdaki program, C ++ kullanarak kayıt değerlerine nasıl erişileceğini gösterir -

#include<iostream> 
#include<string> 
using namespace std; 

class student {     
   public: 
   string sname; 
   int sid; 
}; 

int main() {     
   student S;  
   S.sname = "Sachin"; 
   S.sid = 5; 
   cout<<S.sid<<"\n"<<S.sname;  
   return 0; 
}

Aşağıdaki çıktıyı üretecektir -

5 
Sachin

Kayıt değerleri, değer belirli bir alana değiştirilerek ve ardından bu kayıt yeni bir değişken adına atanarak güncellenebilir. Nesne yönelimli ve işlevsel programlama dilleri kullanılarak nasıl yapıldığını anlamak için aşağıdaki iki örneğe bir göz atın.

Erlang kullanarak kayıt değerlerini güncelleme programı

Aşağıdaki program, Erlang kullanarak kayıt değerlerinin nasıl güncelleneceğini gösterir -

-module(helloworld).  
-export([start/0]).  
-record(student, {sname = "", sid}).   

start() ->  
   S = #student{sname = "Sachin",sid = 5},  
   S1 = S#student{sname = "Jonny"},  
   io:fwrite("~p~n",[S1#student.sid]),  
   io:fwrite("~p~n",[S1#student.sname]).

Aşağıdaki çıktıyı üretecektir -

5
"Jonny"

C ++ kullanarak kayıt değerlerini güncelleme programı

Aşağıdaki program, C ++ kullanarak kayıt değerlerinin nasıl güncelleneceğini gösterir -

#include<iostream> 
#include<string> 
using namespace std;  

class student {    
   public: 
   string sname; 
   int sid; 
};  

int main() {     
   student S;  
   S.sname = "Jonny"; 
   S.sid = 5; 
   cout<<S.sname<<"\n"<<S.sid; 
   cout<<"\n"<< "value after updating"<<"\n"; 
   S.sid = 10; 
   cout<<S.sname<<"\n"<<S.sid; 
   return 0; 
}

Aşağıdaki çıktıyı üretecektir -

Jonny 
5 
value after updating 
Jonny 
10

Lambda hesabı, 1930'larda Alonzo Kilisesi tarafından fonksiyonlarla hesaplamaları incelemek için geliştirilen bir çerçevedir.

  • Function creation - Kilise notasyonu tanıttı λx.E"x" in biçimsel bir argüman ve "E" nin işlevsel vücut olduğu bir işlevi belirtmek için. Bu işlevler adsız ve tek bağımsız değişkenler olabilir.

  • Function application - Kilise notasyonu kullandı E1.E2 fonksiyonun uygulanmasını belirtmek için E1 gerçek tartışmaya E2. Ve tüm işlevler tek bağımsız değişken üzerindedir.

Lambda Calculus Sözdizimi

Lamdba hesabı üç farklı ifade türü içerir, yani,

E :: = x (değişkenler)

| E 1 E 2 (fonksiyon uygulaması)

| λx.E (işlev oluşturma)

Nerede λx.E Lambda soyutlaması olarak adlandırılır ve E, λ-ifadeleri olarak bilinir.

Lambda Calculus'u Değerlendirme

Saf lambda hesabının yerleşik işlevleri yoktur. Şu ifadeyi değerlendirelim -

(+ (* 5 6) (* 8 3))

Burada '+' ile başlayamayız çünkü sadece sayılar üzerinde çalışır. İki indirgenebilir ifade vardır: (* 5 6) ve (* 8 3).

Önce ikisini de azaltabiliriz. Örneğin -

(+ (* 5 6) (* 8 3)) 
(+ 30 (* 8 3)) 
(+ 30 24) 
= 54

β-azaltma Kuralı

Λs ile başa çıkmak için bir azaltma kuralına ihtiyacımız var

(λx . * 2 x) 4 
(* 2 4) 
= 8

Buna β-azaltma denir.

Biçimsel parametre birkaç kez kullanılabilir -

(λx . + x x) 4 
(+ 4 4) 
= 8

Birden fazla terim olduğunda, bunları şu şekilde ele alabiliriz:

(λx . (λx . + (− x 1)) x 3) 9

İç x içe aittir λ ve dıştaki x dıştaki olana aittir.

(λx . + (− x 1)) 9 3 
+ (− 9 1) 3 
+ 8 3 
= 11

Serbest ve Bağlı Değişkenler

Bir ifadede, bir değişkenin her görünümü ya "serbesttir" (λ'ya) veya "sınırlıdır" (λ'ya).

β-azalma (λx . E) y her şeyin yerini alır x içinde ücretsiz olan E ile y. Örneğin -

Alfa İndirgeme

Alfa indirgemesi çok basittir ve bir lambda ifadesinin anlamını değiştirmeden yapılabilir.

λx . (λx . x) (+ 1 x) ↔ α λx . (λy . y) (+ 1 x)

Örneğin -

(λx . (λx . + (− x 1)) x 3) 9 
(λx . (λy . + (− y 1)) x 3) 9 
(λy . + (− y 1)) 9 3 
+ (− 9 1) 3 
+ 8 3 
11

Kilise-Rosser Teoremi

Kilise-Rosser Teoremi şunları belirtir:

  • E1 ↔ E2 ise, o zaman E1 → E ve E2 → E olacak şekilde bir E vardır. "Herhangi bir şekilde küçültme sonunda aynı sonucu verebilir."

  • E1 → E2 ve E2 normal form ise, o zaman E1'den E2'ye normal dereceli bir azalma vardır. "Normal sıra azaltma, varsa her zaman normal bir biçim üretecektir."

Tembel değerlendirme, bir ifadenin değerine ihtiyaç duyulana kadar değerlendirilmesini tutan bir değerlendirme stratejisidir. Tekrarlanan değerlendirmeyi önler.Haskell temelleri Tembel Değerlendirmeye dayanan böyle işlevsel bir programlama diline iyi bir örnektir.

Diskten yalnızca gerekli sayfaları yükleyerek performanslarını artırmak için Unix eşleme işlevlerinde tembel değerlendirme kullanılır. Kalan sayfalar için bellek ayrılmayacaktır.

Tembel Değerlendirme - Avantajlar

  • Dil çalışma zamanının, ifadenin nihai sonucuyla doğrudan bağlantılı olmayan alt ifadeleri atmasına izin verir.

  • Geçici hesaplamaları ve koşulları atarak bir algoritmanın zaman karmaşıklığını azaltır.

  • Programcının, herhangi bir döngüsel bağımlılık içermedikleri sürece, bunları başlattıktan sonra sıra dışı veri yapılarının bileşenlerine erişmesine izin verir.

  • Seyrek erişilen verileri yüklemek için en uygun olanıdır.

Tembel Değerlendirme - Dezavantajlar

  • Oluşturarak nihai sonuçta gerekli olana kadar dil çalışma zamanını alt ifadelerin değerlendirmesini tutmaya zorlar thunks (geciken nesneler).

  • Bazen bir algoritmanın uzay karmaşıklığını artırır.

  • Performansını bulmak çok zordur çünkü icra edilmeden önce ifadeler içerir.

Python kullanarak Tembel Değerlendirme

rangePython'daki yöntem, Tembel Değerlendirme kavramını izler. Daha büyük aralıklar için yürütme süresinden tasarruf sağlar ve hiçbir zaman tüm değerleri aynı anda istemeyiz, bu nedenle bellek tüketimini de azaltır. Aşağıdaki örneğe bir göz atın.

r = range(10) 
print(r) 
range(0, 10) 
print(r[3])

Aşağıdaki çıktıyı üretecektir -

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
3

Program sona erdiğinde bir programın çıktısını depolamak için dosyalara ihtiyacımız var. Dosyaları kullanarak, farklı dillerdeki çeşitli komutları kullanarak ilgili bilgilere erişebiliriz.

İşte bir dosya üzerinde gerçekleştirilebilecek bazı işlemlerin listesi -

  • Yeni bir dosya oluşturmak
  • Mevcut bir dosyayı açmak
  • Dosya içeriğini okuma
  • Bir dosyada veri arama
  • Yeni bir dosyaya yazmak
  • İçeriği mevcut bir dosyaya güncelleme
  • Bir dosyayı silme
  • Bir dosyayı kapatmak

Bir Dosyaya Yazmak

İçeriği bir dosyaya yazmak için önce gerekli dosyayı açmamız gerekecek. Belirtilen dosya yoksa, yeni bir dosya oluşturulacaktır.

C ++ kullanarak içeriğin bir dosyaya nasıl yazılacağını görelim.

Misal

#include <iostream> 
#include <fstream> 
using namespace std;  

int main () {   
   ofstream myfile; 
   myfile.open ("Tempfile.txt", ios::out); 
   myfile << "Writing Contents to file.\n"; 
   cout << "Data inserted into file"; 
   myfile.close(); 
   return 0; 
}

Note -

  • fstream dosya okuma / yazma işlemlerini kontrol etmek için kullanılan akış sınıfıdır.

  • ofstream içeriği dosyaya yazmak için kullanılan akış sınıfıdır.

İşlevsel bir programlama dili olan Erlang kullanarak içeriğin bir dosyaya nasıl yazılacağını görelim.

-module(helloworld).  
-export([start/0]).   

start() ->
   {ok, File1} = file:open("Tempfile.txt", [write]),  
   file:write(File1,"Writting contents to file"), 
   io:fwrite("Data inserted into file\n").

Note -

  • Kullanmamız gereken bir dosyayı açmak için, open(filename,mode).

  • İçeriği dosyaya yazmak için sözdizimi: write(filemode,file_content).

Output - Bu kodu çalıştırdığımızda "Dosyaya içerik yazılıyor" dosyaya yazılacak Tempfile.txt. Dosyanın mevcut içeriği varsa, üzerine yazılacaktır.

Dosyadan Okuma

Bir dosyadan okumak için önce belirtilen dosyayı şurada açmalıyız reading mode. Dosya yoksa, ilgili yöntemi NULL döndürür.

Aşağıdaki program, bir dosyanın içeriğinin nasıl okunacağını gösterir. C++ -

#include <iostream> 
#include <fstream> 
#include <string> 
using namespace std;  

int main () {
   string readfile; 
   ifstream myfile ("Tempfile.txt",ios::in); 
   
   if (myfile.is_open()) {     
      while ( getline (myfile,readfile) ) {       
         cout << readfile << '\n'; 
      } 
      myfile.close(); 
   } else  
      cout << "file doesn't exist";  
   return 0; 
}

Aşağıdaki çıktıyı üretecektir -

Writing contents to file

Note- Bu programda “ios :: in” kullanarak okuma modunda bir metin dosyası açtık ve ardından içeriğini ekrana yazdırdık. Kullandıkwhile "getline" yöntemini kullanarak dosya içeriğini satır satır okumak için döngü yapın.

Aşağıdaki program aynı işlemin nasıl gerçekleştirileceğini gösterir. Erlang. Burada kullanacağızread_file(filename) belirtilen dosyadan tüm içeriği okuma yöntemi.

-module(helloworld).  
-export([start/0]).   

start() ->  
   rdfile = file:read_file("Tempfile.txt"),  
   io:fwrite("~p~n",[rdfile]).

Aşağıdaki çıktıyı üretecektir -

ok, Writing contents to file

Varolan bir Dosyayı Silme

Dosya işlemlerini kullanarak mevcut bir dosyayı silebiliriz. Aşağıdaki program mevcut bir dosyanın nasıl silineceğini gösterirusing C++ -

#include <stdio.h> 

int main () {   
   if(remove( "Tempfile.txt" ) != 0 ) 
      perror( "File doesn’t exist, can’t delete" ); 
   else 
      puts( "file deleted successfully " ); 
   return 0; 
}

Aşağıdaki çıktıyı üretecektir -

file deleted successfully

Aşağıdaki program, aynı işlemi nasıl yapabileceğinizi gösterir. Erlang. Burada yöntemi kullanacağızdelete(filename) mevcut bir dosyayı silmek için.

-module(helloworld).  
-export([start/0]).   

start() ->  
   file:delete("Tempfile.txt").

Output - “Tempfile.txt” dosyası varsa, silinecektir.

Bir Dosyanın Boyutunu Belirleme

Aşağıdaki program, C ++ kullanarak bir dosyanın boyutunu nasıl belirleyebileceğinizi göstermektedir. Burada işlevfseek akışla ilişkili konum göstergesini yeni bir konuma ayarlar, oysa ftell akıştaki geçerli konumu döndürür.

#include <stdio.h> 

int main () {  
   FILE * checkfile; 
   long size; 
   checkfile = fopen ("Tempfile.txt","rb"); 
   
   if (checkfile == NULL)  
      perror ("file can’t open"); 
   else {   
      fseek (checkfile, 0, SEEK_END);    // non-portable 
      size = ftell (checkfile); 
      fclose (checkfile); 
      printf ("Size of Tempfile.txt: %ld bytes.\n",size); 
   } 
   return 0; 
}

Output - "Tempfile.txt" dosyası varsa, boyutunu bayt olarak gösterecektir.

Aşağıdaki program aynı işlemi Erlang'da nasıl yapabileceğinizi göstermektedir. Burada yöntemi kullanacağızfile_size(filename) dosyanın boyutunu belirlemek için.

-module(helloworld).  
-export([start/0]).   

start() ->  
   io:fwrite("~w~n",[filelib:file_size("Tempfile.txt")]).

Output- "Tempfile.txt" dosyası varsa, boyutunu bayt olarak gösterecektir. Aksi takdirde, "0" gösterecektir.