...

Membuat dunia sendiri

by user

on
Category: Documents
0

views

Report

Comments

Transcript

Membuat dunia sendiri
Membuat dunia sendiri
Erik Dominikus
2015-10-31
Abstrak
Kita akan membahas:
1. Perbedaan mendasar bahasa prosedural dan fungsional.
2. Dasar-dasar bahasa fungsional.
3. Beberapa contoh.
Perbedaan mendasar sudut pandang
Bahasa prosedural
Bahasa fungsional
Penyusun (building blocks;
assignment (=),
definisi literal
semua program boils down to
arithmetic/logic operation (+ * - /
definisi fungsi
these primitives)
% & | ^ ~ ! && ||),
definisi variabel
definisi subroutine, subroutine
call, loop (for/while)
Eksekusi/makna/semantik
Yang dilakukan CPU
Menulis ulang ekspresi
Program adalah
sequence of statements
ekspresi
Penyusun bahasa fungsional
Definisi literal
Menyatakan isi suatu dunia (ada apa aja di sana).
False : Bool
True : Bool
Definisi fungsi
Suatu fungsi menyatakan hubungan antara dua dunia.
Kalau hubungan itu cukup menarik, biasanya kita beri nama.
Setiap ekspresi yang cocok dengan pola di kiri tanda = akan ditulis ulang jadi yang di kanan tanda =.
not : Bool -> Bool
not False = True
not True = False
and : Bool -> Bool -> Bool
and True True = True
and _ _ = False
Contoh evaluasi
Misal kita punya:
myfun x y = and (not x) (not y)
not False = True
not True = False
and True True = True
and _ _ = False
Salah satu kemungkinan evaluasi 'myfun True False':
myfun True False
=> and (not True) (not False)
=> and False (not False)
=> False
Contoh evaluasi
Misalnya kita punya:
twice : (a -> a) -> a -> a
twice f x = f (f x)
Contoh evaluasi
twice (\ x -> x + 1) 5
=> (\ x -> x + 1) ((\ x -> x + 1) 5)
=> ((\ x -> x + 1) 5) + 1
== ((\ x -> x + 1) 5) + 1
=> (5 + 1) + 1
=> 6 + 1
=> 7
Contoh: suit Jepang
Rock : Hand
Paper : Hand
Scissors : Hand
Lose : Result
Draw : Result
Win : Result
fight
fight
fight
fight
fight
fight
fight
fight
fight
fight
: Hand -> Hand -> Result
Rock Rock = Draw
Rock Paper = Lose
Rock Scissors = Win
Paper Rock = Win
Paper Paper = Draw
Paper Scissors = Lose
Scissors Rock = Lose
Scissors Paper = Win
Scissors Scissors = Draw
Contoh: pet simulator
Sad : State
Happy : State
Scold : Action
Treat : Action
sim
sim
sim
sim
sim
: State -> Action -> State
Sad Scold = Sad
Sad Treat = Happy
Happy Scold = Sad
Happy Treat = Happy
Contoh: mengukur lebar kolom dalam tabel
Rigid : Size -> LayoutElem
Resizable : MinSize -> LayoutElem
Size = Int
MinSize = Int
WantedTotalSize = Int
fit : WantedTotalSize -> [LayoutElem] -> [Size]
fit wantedTotalSize elems = ...
Separation of concern: Tidak peduli isi kolomnya apa. Cuma berurusan dengan lebar kolom.
Reusability: Bisa juga dipakai untuk menghitung tinggi baris. Tidak perlu mengubah apa-apa.
Hal yang sebetulnya dilakukan kode ini: membagi rata sisa jarak ke semua elemen yang bisa
mengembang.
https://github.com/edom/music/blob/e668763447295cace4ed2c2ea266fc9a9bbb75f0/DrawCairo.hs
baris 155–180
Kesimpulan
• suatu fungsi menghubungkan dua dunia
• kode adalah model
Fly UP