Sabtu, 17 Maret 2018

Belajar Haskell di Olympia.id



Olympia merupakan salah satu situs belajar daring berbahasa Indonesia yang dapat kita manfaatkan untuk belajar pemrograman. Materi-materi yang ada beberapa di antaranya berupa mata kuliah dari ITB yang dipublikasikan secara umum. Olympia dilengkapi dengan fitur kuis daring yang menggunakan sistem autograder.

Cara kerja autograder kurang lebih yaitu kita tulis kodenya, unggah, lalu sistem autograder akan menilai "jawaban" tersebut berdasarkan kecocokan masukan dan keluaran. Dari banyak mata kuliah umum yang ada, Pemrograman Fungsional adalah salah satu yang membuat saya tertarik. Bahasa pemrograman dari mata kuliah umum tersebut adalah Haskell. Oleh karena itu, Olympia dapat kita manfaatkan untuk belajar Haskell berbasis soal kuis.

Ilmu Haskell Apa Saja yang Akan Saya Dapatkan?

Kuis pemrograman fungsional di Olympia kurang lebih mengasah input processing, penggunaan fungsi ekpresif seperti let ... in, conditional, fungsi dasar, fungsi rekursif, Listguardslambda function, sedikit Control.Monad, dan yang terpenting adalah logika penalaran pemrograman fungsional.

Input Processing

Kita akan menemukan berbagai contoh masalah pemrosesan masukan saat mengerjakan soal kuisnya. Kita akan dilatih berpikir untuk mengatasi berbagai contoh masukan seperti di bawah.

Satu Kolom Bilangan Hingga End-Of-File (EOF)

1 2 3 4

Dua Kolom Bilangan Hingga EOF

1 2 3 4 5 6 7 8

Satu Kolom List Hingga EOF

[] [1,2,3] [1,2,3,4] ['s','a','y'] ['k'] []

Dua Kolom List Hingga EOF

[] [] [] [1] [1] [] [1,2,3] [4,5,6] [] [] [] ['k'] ['k'] [] ['s','a'] ['y']

Dua Kolom Perpaduan List dan Bilangan Hingga EOF

1 [1,2,3] 24 [] [1,2,3] 1 [] 24

Dan Sebagainya

Masih ada beberapa contoh masukan. Namun, itu tadi berupa contoh masukan yang sering muncul.

Fungsi Ekspresif

Beberapa soal kuis dapat diselesaikan menggunakan fungsi ekspresif seperti let ... in. Sebagai contohnya, lihat kode di bawah.

module ContohFungsiEkspresif where luasLingkaran :: Float -> Float luasLingkaran r = let pi = 3.1415 in pi * (r * r) -- main function di sini

Selain itu, ada juga kasus penggunaan where. Sebagai contohnya, lihat kode di bawah.

module ContohFungsiEkspresif where luasLingkaran :: Float -> Float luasLingkaran r = pi * (r * r) where pi = 3.1415 -- main function di sini

Conditional, Fungsi Dasar, dan Fungsi Rekursif

Sebenarnya tidak perlu dijelaskan pun biasanya pemrogram sudah tahu apa maksudnya. Apabila belum tahu, bisa lihat kode di bawah.

module ContohProgram where fungsiDasar :: Int -> Int fungsiDasar x = x + 2 fungsiRekursif :: Int -> Int fungsiRekursif 0 = 1 fungsiRekursif n = (if (odd n) then 1 else 0) + fungsiRekursif (n - 1) -- main function di sini

List

Terdapat berbagai macam permasalah List di soal kuis Olympia. Ada List of Integer dan ada List of Char (String). Soal-soal yang ada lebih ke pemrosesan List seperti contohnya menjumlahkan semua elemen dari suatu List.

module SumList where sumList :: [Int] -> Int sumList [] = 0 sumList (x:xs) = x + sumList xs -- main function di sini

Guards

Guards pada dasarnya mirip dengan conditional. Kita ambil contoh fungsiRekursif di atas. Jika menggunakan guards, kodenya akan menjadi seperti di bawah.

module ContohGuards where fungsiRekursif :: [Int] -> Int fungsiRekursif n | (odd n) = 1 + fungsiRekursif (n - 1) | otherwise = 0 + fungsiRekursif (n - 1) -- main function di sini

Lambda Function dan Sedikit Control.Monad

Contoh Control.Monad yang akan digunakan adalah fungsi mapM_ . Saya gunakan untuk mencetak keluaran jawabannya. Penggunaan fungsi tersebut biasanya dibarengi dengan fungsi lambda atau lambda function.

module ContohKeluaran where -- asumsi terdapat berbagai fungsi di sini main :: IO () main = do -- asumsi terdapat berbagai ekspresi di sini mapM_ (\x -> (print. sumList) x) list

Notasi \ adalah notasi lambda di Haskell. \xberarti fungsi lambda dengan parameter x. ->merupakan pemisah antara head dan body dari fungsi lambda. Head dari fungsi lambda di atas adalah \x dan body dari fungsi lambda di atas adalah (print. sumList) x. Adapun listdiasumsikan sebagai variable yang menyimpan barisan dari bilangan bulat.

Tips Mengerjakan

Sebelum mengerjakan soal kuisnya, kita perlu tahu beberapa fungsi Haskell seperti getContents, map, lines, words, dan read.

getContents

Fungsi ini akan mengambil semua masukan dari berkas masukan hingga menemui End-Of-File (EOF).

1 2 3 4 5 6

Masukan di atas akan menjadi seperti berikut dengan type signature IO String.

"1 2 3\n4 5 6"

lines

Fungsi ini akan membuat List of String baru. Pemisah setiap elemennya adalah newline character \n.

"1 2 3\n4 5 6"

Masukan di atas akan menjadi seperti berikut.

["1 2 3", "4 5 6"]

words

Fungsi ini akan membuat List of String baru. Pemisah setiap elemennya adalah space.

"1 2 3"

Masukan di atas akan menjadi seperti berikut.

["1", "2", "3"]

read

Fungsi ini biasa digunakan untuk melakukan "konversi" dari String ke bentuk lain.

"2"

Masukan di atas akan menjadi seperti berikut dengan type signature :: Int. Berubah menjadi bilangan bulat.

2

Kombinasi map dan read

Fungsi map digunakan untuk memproses suatu List menjadi "bentuk" lain. Misal, kita akan mengubah List of String menjadi List of Int. Untuk dapat memproses List, kita membutuhkan map.

map read $ ["1", "2", "3"] :: [Int]

Hasil dari ekspresi di atas terlihat di bawah.

[1, 2, 3]

Adapun proses langkah-demi-langkahnya seperti berikut.

> map read $ ["1", "2", "3"] :: [Int] > [] : ambil elemen pertama, ubah jadi Int, simpan > [1] : ambil elemen kedua, ubah jadi Int, simpan > [1, 2] : ambil elemen ketiga, ubah jadi Int, simpan > [1, 2, 3]: List kosong, keluarkan hasilnya > [1, 2, 3]

Catatan: map read $ ["1", "2", "3"] :: [Int]" sama saja dengan map read (["1", "2", "3"]) :: [Int].

Penutup

Setelah mengetahui fungsi-fungsi dasar tadi, barulah coba kerjakan soal-soal kuisnya. Apabila mengalami kesulitan, cobalah untuk bertanya. Salah satu tempatnya yaitu grup komunitas pemrogram Haskell di Facebook. Apabila tertarik dengan pemrograman fungsional, bergabunglah ke komunitas Lambda Indonesia. Selamat belajar!

0 komentar:

Posting Komentar