Konsep fileWhat is Haskell? • Haskell merupakan bahasa pemrograman yang; fungsional, malas dan...
Transcript of Konsep fileWhat is Haskell? • Haskell merupakan bahasa pemrograman yang; fungsional, malas dan...
What is Haskell? • Haskell merupakan bahasa pemrograman yang;
fungsional, malas dan murni.
• ‘fungsional’ evaluasi dari programnya sama dengan mengevaluasi sebuah fungsi dalam bahasa matematika murni
• ‘malas’ tidak mengevaluasi ekspresi-ekspresi yang digunakan (kebalikannya ‘teliti’)
• ‘murni’ tidak memperbolehkan adanya Efek Samping, yaitu sesuatu yang mempengaruhi “bagian” di program. Misalnya fungsi yang mencetak sesuatu ke layar yang mempengaruhi nilai dari variabel global. Bahasa pemrograman yang tanpa efek samping akan menjadi sangat tidak berguna! Haskell menggunakan sistem monads untuk mengisolasi semua komputasi kotor dari program dan menampilkannya dengan cara yang aman.
Standar dalam Prelude.hs
• + , - , * , / • ^ • head • tail • !! • take
• drop
• length
• sum
• product
• ++
• reverse
Bagaimana jika kita ingin buat fungsi sendiri…..?!
Ex : • Buat fungsi quadruple • Buat fungsi factorial • Buat fungsi average
Percabangan
Statement if-then-else terdapat di bahasa Haskell.
Contoh penggunaannya adalah sebagai berikut:
if 1 < 2 then “Satu lebih kecil dua”
else “Satu tidak lebih kecil dua”
> "Satu lebih kecil dua”
Abstraksi Lambda (Lambda Abstractions)
Disamping menggunakan menggunakan persamaan untuk
menetapkan fungsi, kita juga dapat menggunakan menetapkannya
”anonim” melalui abstraksi lambda.
Sebagai contoh, sebuah fungsi ekuivalen dengan inc dapat ditulis sebagai \x -> x+1. Sama seperti fungsi add yang ekuivalen dengan
\x -> \y -> x+y.
Abstraksi lambda bersarang seperti ini dapat ditulis dengan notasi singkat yang ekuivalen \x y -> x+y. Dalam kenyataannya,
persamaan :
inc x = x+1 add x y = x+y
adalah kependekan dari
inc = \x -> x+1
add = \x y -> x+y
GRAFIK Dalam Haskell, kita juga dapat menggambarkan
objek 3 dimensi. Penggambaran objek 3 dimensi
ini dimungkinkan karena dalam Haskell kita dapat
menuliskan pemrograman OpenGL.
Contoh:
import Graphics.UI.GLUT
import Graphics.Rendering.OpenGL
main = do
(progName,_) <-getArgsAndInitialize
createAWindow progName
mainLoop
createAWindow windowName = do
createWindow windowName
displayCallback $= displayPoints
displayPoints = do
clear [ColorBuffer]
renderPrimitive Polygon
$mapM_ (\(x, y, z)->vertex$Vertex3 x y z) myPoints
myPoints :: [(GLfloat,GLfloat,GLfloat)]
myPoints =
[(-0.25, 0.25, 0.0)
,(0.75, 0.35, 0.0)
,(0.75, -0.15, 0.0)
,((-0.75), -0.25, 0.0)]
Adapun outputnya adalah:
Fungsi
Fungsi dapat dibuat dengan menuliskan tipenya,
lalu mendefinisikannya. Misalnya:
tambahSatu :: Integer -> Integer tambahSatu x = x + 1
Jika kita gunakan fungsinya, inilah outputnya:
? tambahSatu 5
> 6
? tambahSatu 999
> 1000
Baris yang pertama:
tambahSatu :: Integer -> Integer
Pattern Matching
faktorial :: Integer -> Integer
faktorial 0 = 1
faktorial n = n * faktorial (n - 1)
? faktorial 3
> 6
? faktorial 0
> 1
Pertama dicek apakah argumen “match” dengan 0.
Karena tidak, maka dicek apakah argument “match”
dengan n. Karena n bisa berupa Integer apapun (jenis
fungsinya adalah Integer -> Integer), maka 3 “match”
dengan n dan definisi fungsi yang berkaitan digunakan.
List
listKosong :: [a] -> Bool
listKosong [] = True
listKosong x = False
? listKosong []
> True
? listKosong [1..10]
> False
? listKosong [10..1]
> True
Dari contoh di atas kita tahu bahwa list [10..1]
ternyata adalah list kosong. Artinya konstruksi
list [a..b] akan menghasilkan list tidak jika dan
hanya jika a lebih kecil atau sama dengan b.
balikList :: [a] -> [a]
balikList [] = []
balikList (x:xs) = balikList xs ++ [x]
adaDiList :: [Integer] -> Integer -> Bool
adaDiList [] n = False
adaDiList (x:xs) n = if x == n then
True
else
(adaDiList xs n)
Contoh List
hilangkan :: [Integer] -> Integer -> [Integer]
hilangkan [] n = []
hilangkan (x:xs) n = if x == n then
hilangkan xs n
else
[x] ++ (hilangkan xs n)