Tipe Data Aljabar
Modelkan domain Anda.
Tipe Data Aljabar adalah pelajaran Scala for Backend Engineering & Functional Programming gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Scala for Backend Engineering & Functional Programming, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Scala for Backend Engineering & Functional Programming mencakup 4 pelajaran total.
Apa Itu ADT?
Tipe data aljabar (ADT) adalah tipe yang dibangun dengan menggabungkan tipe-tipe lain. Di Scala, Anda memodelkan ADT dengan sealed trait serta varian case class dan case object.
ADT memungkinkan Anda mendeskripsikan bentuk data domain secara tepat.
Tipe Sum
Tipe sum berarti sebuah nilai merupakan salah satu dari beberapa alternatif (sebuah OR). Lampu lalu lintas adalah Merah OR Kuning OR Hijau.
Anda menyatakannya dengan trait sealed dan beberapa varian.
sealed trait Light
case object Red extends Light
case object Yellow extends Light
case object Green extends Light
object Main {
def main(args: Array[String]): Unit = {
val l: Light = Yellow
println(l)
}
}Tipe Product
Tipe product berarti sebuah nilai menggabungkan beberapa field (sebuah AND). Sebuah titik memiliki x AND y.
Kelas case adalah tipe product.
case class Point(x: Int, y: Int)
object Main {
def main(args: Array[String]): Unit = {
val p = Point(3, 4)
println(s"${p.x} and ${p.y}")
}
}Menggabungkan Tipe Sum dan Product
ADT nyata menggabungkan keduanya: trait sealed (sum) yang variannya berupa kelas case (product).
Di sini, Shape adalah Circle (dengan radius) OR Rectangle (dengan lebar dan tinggi).
sealed trait Shape
case class Circle(radius: Double) extends Shape
case class Rectangle(w: Double, h: Double) extends Shape
object Main {
def main(args: Array[String]): Unit = {
val s: Shape = Rectangle(3, 4)
println(s)
}
}Mengoperasikan ADT
Anda memproses ADT dengan melakukan pencocokan pola terhadap variannya. Setiap cabang menangani satu bentuk.
sealed trait Shape
case class Circle(radius: Double) extends Shape
case class Rectangle(w: Double, h: Double) extends Shape
object Main {
def area(s: Shape): Double = s match {
case Circle(r) => 3.14159 * r * r
case Rectangle(w, h) => w * h
}
def main(args: Array[String]): Unit = {
println(area(Circle(2)))
println(area(Rectangle(3, 4)))
}
}Memodelkan Domain
ADT membuat keadaan yang tidak valid tidak dapat direpresentasikan. Modelkan metode pembayaran sebagai kumpulan tertutup dari opsi yang valid.
sealed trait PaymentMethod
case class CreditCard(number: String) extends PaymentMethod
case class BankTransfer(iban: String) extends PaymentMethod
case object Cash extends PaymentMethod
object Main {
def main(args: Array[String]): Unit = {
val m: PaymentMethod = Cash
println(m)
}
}ADT Rekursif
ADT dapat merujuk pada dirinya sendiri, yang memungkinkan Anda memodelkan pohon dan daftar. Berikut adalah pohon biner sederhana.
sealed trait Tree
case object Leaf extends Tree
case class Node(value: Int, left: Tree, right: Tree) extends Tree
object Main {
def main(args: Array[String]): Unit = {
val t: Tree = Node(1, Leaf, Node(2, Leaf, Leaf))
println(t)
}
}Melakukan Folding pada ADT Rekursif
Rekursi dan pencocokan memungkinkan Anda memproses seluruh struktur. Di sini, kita menjumlahkan setiap nilai dalam pohon.
sealed trait Tree
case object Leaf extends Tree
case class Node(value: Int, left: Tree, right: Tree) extends Tree
object Main {
def sum(t: Tree): Int = t match {
case Leaf => 0
case Node(v, l, r) => v + sum(l) + sum(r)
}
def main(args: Array[String]): Unit = {
val t = Node(1, Node(2, Leaf, Leaf), Node(3, Leaf, Leaf))
println(sum(t))
}
}Mengapa ADT?
ADT sangat kuat karena:
- Mendeskripsikan data secara tepat sebagai sum dan product
- Membuat keadaan ilegal mustahil untuk dibuat
- Sangat cocok dengan pencocokan pola lengkap
- Dapat digunakan untuk struktur rekursif seperti pohon dan daftar
ADT vs Pewarisan
OOP tradisional akan menyebarkan perilaku ke berbagai subkelas. ADT menjaga definisi data tetap tertutup dan menempatkan perilaku dalam fungsi yang melakukan pencocokan pola.
Pemisahan data dan perilaku ini merupakan ciri khas rancangan fungsional.
Menggabungkan Semuanya
ADT kecil yang lengkap, dengan fungsi yang menangani setiap varian.
sealed trait Json
case class JNum(n: Double) extends Json
case class JStr(s: String) extends Json
case object JNull extends Json
object Main {
def render(j: Json): String = j match {
case JNum(n) => n.toString
case JStr(s) => "\"" + s + "\""
case JNull => "null"
}
def main(args: Array[String]): Unit = {
List(JNum(3.0), JStr("hi"), JNull).foreach(j => println(render(j)))
}
}Pemeriksaan Singkat
Uji pemahaman Anda tentang ADT.
Rangkuman
Anda telah mempelajari cara membangun tipe data aljabar:
- Tipe sum: trait sealed dengan beberapa varian (OR)
- Tipe product: kelas case dengan field (AND)
- Gabungkan keduanya untuk memodelkan domain secara tepat
- ADT dapat bersifat rekursif (pohon, daftar)
- Proses dengan pencocokan pola
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Tipe Data Aljabar” gratis?
Ya — teks lengkap “Tipe Data Aljabar” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Scala for Backend Engineering & Functional Programming, upgrade ke CoddyKit PRO. Kursus Scala for Backend Engineering & Functional Programming mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Tipe Data Aljabar”?
Modelkan domain Anda. Kamu berlatih Scala for Backend Engineering & Functional Programming dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Scala for Backend Engineering & Functional Programming?
Tidak diperlukan pengalaman sebelumnya. Scala for Backend Engineering & Functional Programming di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Tipe Data Aljabar” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Scala for Backend Engineering & Functional Programming ini?
Ya. Setiap pelajaran Scala for Backend Engineering & Functional Programming menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Case Class
- Trait Sealed
- Tipe Data Aljabar
- Pencocokan Menyeluruh