Bagikan ke: Twitter | Facebook | LinkedIn
Daftar Isi
Pendahuluan
Paradigma Fungsional adalah sebuah alternatif dari OOP (Object Oriented Programming), perbedaannya adalah bila oop semuanya adalah object maka di fungsional semuanya adalah fungsi.
pada dahulu bahasa komputer terbagi menjadi 2, yaitu bahasa berbasis mesin turing dan yang satunya berbasis lambda kalkulus, cara kerja turing machine adalah memodifikasi sesuatu dan menghasilkan efek samping (side effect) sedangkan program berbasis lamba kalkulus tidak melakukan mutasi terhadap variable.
tapi karna bahasa fungsional tidak dapat mengubah sesuatu maka dibuatlah sebuah solusi, diantaranya adalah menggunakan monad.
Perbedaan Dengan OOP
kita bisa liat perbedan antara oop dengan fungsionalnya dengan jelas pada tabel dibawah
OOP Pattern/Principle | Fungsional |
---|---|
Single Responsibility Principle | Functions |
Open/Closed Principle | Functions |
Dependency Inversion Principle | Functions, also |
Interface Segregation Principle | Functions |
Factory Pattern | You will be assimilated ! |
Strategy Pattern | Function again |
Decorator Pattern | Functions |
Visitor Pattern | Resistance is futile! |
Kelebihan Functional Programming
di paradigma fungsional tidak ada yang namanya design principle atau pattern semuanya adalah fungsi, adapun kelebihan fungsional programming adalah
first-class dan higher-order function
yang dimaksud high-order fungsi adalah bahwa fungsi dapat menjadi sebuah input untuk fungsi lain, sedangkan first-class adalah bahwa status fungsi sama dengan data yang lainya.
contoh dalam bahasa racket (lisp dialects family) seperti ini :
#lang racket
; fungsi yang mengambil 1 input dan mengeluarkan 1 output
define (return x)
(
x)
; fungsi yang mengambil 2 input dan mengeluarkan 1 output
define (add x y)
(+ x y))
(
; fungsi yang mengambil 2 fungsi menjadi 1
define add2 (return add)) (
pattern matching
di fungsional programming ada sebuah fungsi yang mirip dengan
switch case
seperti bahasa Java atau C++
contoh dalam bahasa haskell :
doEncAlg::Int -> Int -> Int -> Int
doEncAlg a b x| DC.isAlpha . DC.chr $ x = doMath + initChar
| otherwise = x
where
= if DC.isUpper $ DC.chr x then 65 else 97
initChar = x - initChar
numChar = (a * numChar + b) `mod` 26 doMath
dalam haskell pattern matching biasanya digunakan untuk monad.
type system
type system atau tipe sistem adalah cara untuk menentukan jenis-jenis nilai yang diizinkan dalam bahasa pemrograman dan operasi yang diizinkan untuk dilakukan pada nilai-nilai tersebut. Dalam bahasa pemrograman fungsional, sistem tipe merupakan alat yang penting untuk memastikan kebenaran dari program dan mengijinkan compiler untuk menangkap kesalahan pada saat compile, bukan membiarkan kesalahan tersebut muncul sebagai runtime error.
contohnya adalah kode haskell diatas
doEncAlg::Int -> Int -> Int -> Int
yang artinya adalah bahwa fungsi doEncAlg
menerima 3 variable bertipe
integer dan memberikan output integer, type system seperti ini sangatlah
membantu, karna error akan terjadi pada compile time (waktu kompilasi)
dan bukan pada runtime time (waktu saat kode dijalankan), disini juga
membuat kita bisa tau dengan mudah mengenai fungsi ini.
data structure
dalam fungsional programming terdapat kelebihan daripada paradigma yang lain, diantaranya :
- Presisten: semua data dalam fungsional programming berupa immutable atau tidak dapat diubah, keuntungaanya adalah kita tidak perlu memikirkan tentang efek samping atau urutan operasi yang dilakukan.
- Concurrency: karna data bersifat Immutable maka kita dapat dengan aman membaginya antar thread sehingga kita dengan mudah membuat program concurrent.
- Modular: karna adanya first-class dan higher-order function kita dengan mudah dapat membagi beberapa program terpisah, dan juga dapat mengikuti filosofi UNIX
REPL
repl merupakan singkatan dari Read Evaluate Print Loop, kelebihan ini hampir mirip dengan bahasa python, lua atau ruby, REPL sendiri pertama kali ada pada bahasa program LISP, yang pada saat itu sangatlah berguna karna programmer bahasa yang lain sibuk memperbaiki kodenya (debugging) seorang lisp programmer lebih fokus pada masalah, namun pada saat itu REPL tidak secepat saat ini.
lazy evaluation dan Partial application
bahasa program fungsional biasanya bersifat lazy evaluation yang artinya adalah REPL tidak akan menjalankan kodenya jika tidak kita tidak memerlukan outputnya sehingga memori yang dipakai bisa optimal.
sedangkan partial application adalah kita bisa menggunakan sebuah fungsi yang mengambil 2 input tetapi kita bisa memberinya 1 setelah itu kita dapat memberinya lagi, berkat adanya lazy evaluation maka tidak akan ada error.
contoh kodenya dalam bahasa haskell :
add :: Int -> Int -> Int
= x + y
add x y
add10 :: Int -> Int
= add 10 add10
diatas bisa dijelaskan bahwa fungsi add mengambil 2 input dan memberikan
1 output, tetapi kita bisa memanfaatkan lazy evaluate dan partial
application seperti fungsi add10
yang hanya memerlukan 1 input.
Daftar Pustaka
Haskell
→ HomepageRacket
→ HomepagePractical Adult Insights
→ What is an Ivory Tower?