مفاهیم Functional programming در کاتلین

در اینجا قصد داریم با بعضی از مفاهیم functional programming به صورت کلی آشنا شویم.

  • مفاهیمی که قرار است در اینجا توضیح مختصری داده شود شامل مفاهیم زیر است
  • Side Effect
  • Pure function
  • Lambda expression
  • Higher-Order Function

اثر جانبی(side effect) : زمانی که یک تابع، شی یا داده‌ای را خارج از فضای خود ( scope) تغییر دهد ما با side effect رو به رو هستیم.

تابع سره (Pure function) : در برنامه نویسی فانکشنال فقط به توابع سره (Pure function)، تابع گفته میشود؛ تابع سره به تابعی گفته میشود که هم ورودی دارد و هم خروجی و هم چنین خروجی باید غیر قابل تغییر (immutable) باشد و side effect هم نداشته باشد.(یعنی تمام شرایط باید در یک تابع جمع شود تا تبدیل به تابع سره شود.)

** مسلم است که نمی‌توان تمام توابع را در یک برنامه به صورت سره نوشت مثلا توابعی که چیزی را از فایل سیستم میخوانند یا یک صفحه وب را از اینترنت واکشی می‌کنند ممکن است خروجی متغییری داشته باشند**

مثالی از توابع غیر سره :

fun impure1(a:Int):Int{

print ("a = ${a}")

return a

}

تابع impure1 یک تابع غیر سره است چون شامل side effect است.



fun impure2 (a:Int ){

print(a+5)

}

تابع impure2 یک تابع غیر سره است به این دلیل که خروجی نداریم.


fun impure 3():Int {

return 5

}

تابع impure3 یک تابع غیر سره است چون ورودی ندارد.


fun impure4 (a:Int ):Dauble{

return a*math.random()

}

تابع impure4 یک تابع غیر سره است چون هربار خروجی تغییر میکند.


** زبان‌هایی که functional را پشتیبانی میکنند توابع سره را به عنوان متغییر (value ) در نظر میگیرند **

و حالا Lambda expression چیست؟

در واقع Lambda expression توابع سره بی‌نامی هستند که میتوانیم با آنها مانند یک متغییر رفتار کنیم و آنها رو به عنوان آرگومان به توابع منتقل کنیم.

val add : (Int, Int) -> Int = { a, b -> a + b }

در واقع عبارت بالا مثالی از یک Lambda expression است که دو ورودی از نوع Int را دریافت میکند و حاصل جمع دو ورودی را به عنوان خروجی (که از نوع Int ) است بر‌میگرداند.

شکل تابعی عبارت بالا به این صورت است

fun addF (a:Int , b:Int):Int{

return a+b

}

و Higher-Order Function :

به توابعی که یا یک تابع را به عنوان آرگومان در نظر میگیرند یا یک تابع را به عنوان خروجی

برمیگردانند high-order function گفته میشود.

مثالی از حالت اول یعنی تابعی که یک تابع را به عنوان ورودی در نظر میگیرد:

fun passMeFunction(fun abc(){
val user = User()
user.name = "ABC"
println("Lambda is awesome")
})

مثالی از حالت دوم یعنی تابع high-order یک تابع را به عنوان خروجی برمیگرداند

تابع زیر را در نظر بگیرید

fun add(a: Int, b: Int): Int {
return a + b
}

و حال این تابع را به عنوان خروجی برای تابع زیر در نظر میگیریم

fun returnMeAddFunction(): ((Int, Int) -> Int) {
// can do something and return function as well
// returning function
return ::add
}

((Int, Int) -> Int)

در عبارت بالا(int , int ) به این معناست که ما باید دو تا پارامتر از نوع int را وارد کنیم و int هم به این معناست که خروجی تابع باید از نوع int باشد

حال تابع returnMeAddFunction را فراخوانی میکنیم

val add = returnMeAddFunction()

val result = add(10,11)




منابع : https://hackernoon.com/functional-programming-by-example-with-kotlin-27fd7e49b55f

https://medium.com/tompee/idiomatic-kotlin-higher-order-functions-and-function-types-adb59172796

https://blog.mindorks.com/understanding-higher-order-functions-and-lambdas-in-kotlin