Konsep
Bahasa Pemrograman Pertemuan 6
Evangs Mailoa
HASKELL
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.
HASKELL memang mudah…. • How about : double (double 2) ….?! =8
Apa itu
“functional programming”?
Misalkan n = 5, maka perhitungannya menjadi :
Dengan HASKEL, kita cukup memanggil fungsi : • Sum [1..5] • Sum [1,2,3,4,5]
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
Comment
Type dalam HASKELL
Type dalam HASKELL
Type dalam HASKELL
Try this!
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
Contoh Lambda
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: Adapun outputnya adalah: 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)]
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.
Contoh List 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) hilangkan :: [Integer] -> Integer -> [Integer] hilangkan [] n = [] hilangkan (x:xs) n = if x == n then hilangkan xs n else [x] ++ (hilangkan xs n)
Mau bertanya..?