27
Konsep Evangs Mailoa Bahasa Pemrograman Pertemuan 6

Konsep fileWhat is Haskell? • Haskell merupakan bahasa pemrograman yang; fungsional, malas dan murni. • ‘fungsional’ evaluasi dari programnya sama dengan

Embed Size (px)

Citation preview

Konsep

Evangs Mailoa

Bahasa Pemrograman

Pertemuan 6

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.

• How about :

double (double 2) ….?!

= 8

HASKELL memang mudah….

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:

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)

Mau bertanya..?