Di Erlang From 99 Lisp Problems terdapat contoh dasar-dasar kode Erlang, namun tidak ada pembahasan bagaimana cara kerja dari kode-kode tersebut. Pada post ini saya akan membahas problem 3 dan problem 4. Problem-problem yang lain akan saya bahas di lain waktu.
Problem 1 dan 2 bisa dilihat di sini. Bila anda mendapati ada simbol-simbol yang tidak saya bahas di sini (seperti [H|T], [_|T], dsb) bisa di baca di tulisan-tulisan saya sebelumnya.
Problem 3. Element at
element_at(L,1) -> hd(L);
element_at([_|T],Pos) -> element_at(T,Pos - 1).
Input list adalah [a,b,c,d], sehingga L = [a,b,c,d]. Kita akan mencari elemen ke-3 dari list tersebut dengan perintah melalui shell nama_modul:element_at(L,3). Urutan list dimulai dari 1 dan bukan 0. Ini ditunjukkan pada fungsi element_at(L,1). hd() adalah built-in function (BIF) untuk mencari kepala (urutan pertama) dari list. Cara kerja program di atas secara berurutan adalah sebagai berikut:
Catatan: urutan angka yang mengandung huruf “a” menggunakan fungsi element_at(L,1) sedangkan “b” menggunakan element_at([_|T],Pos).
1a. tidak digunakan.
1b. element_at([a,b,c,d], 3) -> element_at([b,c,d], 2).
2a. tidak digunakan.
2b. element_at([b,c,d], 2) -> element_at([c,d], 1).
3a. element_at([c,d], 1) -> hd(c,d) -> c.
3b. tidak digunakan.
Problem 4.a. Length list
len([]) -> 0;
len([_|T]) -> 1 + len(T).
Masih menggunakan input L = [a,b,c,d], program dijalankan dengan perintah melalui shell nama_modul:len(L). Cara kerja program di atas secara berurutan adalah sebagai berikut:
Catatan: urutan angka yang mengandung huruf “a” menggunakan fungsi len([]) -> 0 , sedangkan “b” menggunakan len([_|T]) -> 1 + len(T).
1a. tidak digunakan karena input bukan berupa list kosong.
1b. len(a,b,c,d) -> 1 + len(b,c,d]).
2a. tidak digunakan.
2b. 1 + len(b,c,d) -> 1 + 1 + len(c,d) -> 2 + len(c,d)
3a. tidak digunakan.
3b. 2 + len(c,d) -> 2 + 1 + len(d) -> 3 + len(d)
4a. tidak digunakan.
4b. 3 + len(d) -> 3 + 1 + len([]) -> 4 + 0 -> 4.
len(d) hanya mempunyai kepala dan tidak memiliki ekor sehingga ketika menggunakan fungsi len([_|T]) -> 1 + len(T) akan tampak sebagai berikut len(d) -> 1 + len([]) -> 1 + 0 -> 1.
Problem 4.b. Length list with fold
lenf(L) -> lists:foldl(fun(_,Len)-> 1 + Len end, 0, L).
Erlang mempunyai banyak libraries yang terdiri dari modul-modul. Kita akan menggunakan modul lists yang telah disediakan oleh Erlang. Modul lists mempunyai fungsi foldl/3 (fungsi foldl yang memiliki 3 argumen) yang akan digunakan pada contoh program kali ini. Sebelumnya akan saya uraian dulu pemakaian fungsi lists:foldl/3:
lists:foldl/3 mempunyai 3 argumen:
-
foldl/1(argumen ke-1) diisi dengan fungsi yang memiliki 2 argumen misalnyafun(X,Sum)-> X + Sum.
-
foldl/2(argumen ke-2) diisi dengan nilai awal untuk argumen ke-2 dari fungsifun(X,Sum). Kalau nilainya 0 makafun(X,0).
-
foldl/3(argumen ke-3) diisi dengan list yang akan diproses mulai dari kiri. Jika adalist [1,2,3,4]maka akan diproses mulai dari angka 1. Sekedar info, padalists:foldr/3, list akan di proses mulai dari kanan
Sekarang mari kita lihat cara kerja contoh program yang dijalankan melalui shell dengan perintah nama_modul:lenf(L) secara berurutan:
1. lists:foldl(fun(a,0) -> 1 + 0 end, 0, [a,b,c,d]) -> 1
2. lists:foldl(fun(b,1) -> 1 + 1 end, 0, [b,c,d]) -> 2
3. lists:foldl(fun(c,2) -> 1 + 2 end, 0, [c,d]) -> 3
4. lists:foldl(fun(d,3) -> 1 + 3 end, 0, [d]) -> 4
Variabel L dari bentuk [a,b,c,d]menjadi [d]cuma untuk mempermudah pemahaman saja dan tidak berarti variable L berubah elemennya. He…he.. agak ribet. Kalau nggak ada yang protes aku biarin aja deh.