diff --git a/SUMMARY.md b/SUMMARY.md index 236cd9c4..1037919f 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -12,7 +12,7 @@ - [Bab 10: Aplikatif Functors](ch10-id.md) - [Bab 11: Transformasi Lagi, Secara Alami](ch11-id.md) - [Bab 12: Melintasi Batu](ch12-id.md) -- [Bab 12: Monoid Menyatukan Semuanya](ch13-id.md) +- [Bab 13: Monoid Menyatukan Semuanya](ch13-id.md) - [Lampiran A: Dukungan Fungsi Esensial](appendix_a-id.md) - [Lampiran B: Dukungan Struktur Aljabar](appendix_b-id.md) - [Lampiran C: Utilitas Pointfree](appendix_c-id.md) diff --git a/ch09-id.md b/ch09-id.md index f3ff6912..93242d58 100644 --- a/ch09-id.md +++ b/ch09-id.md @@ -428,7 +428,7 @@ Hukum kedua serupa: (compose(join, of) === compose(join, map(of))) === id; ``` -It states that, for any monad `M`, `of` and `join` amounts to `id`. We can also `map(of)` and attack it from the inside out. We call this "triangle identity" because it makes such a shape when visualized: +Ini menyatakan bahwa, untuk setiap monad `M`, `of` dan `join` berjumlah `id`. Kita juga bisa `map(of)` dan menyerangnya dari dalam ke luar. Kami menyebutnya "triangle identity" karena membuat bentuk seperti itu ketika divisualisasikan. monad identity law @@ -444,7 +444,7 @@ Tunggu, saya sedang berpikir... Ya tentu saja! Mereka adalah hukum untuk suatu k Tapi itu berarti kita membutuhkan fungsi komposisi untuk melengkapi definisi. -Melihat: +Lihat: ```js const mcompose = (f, g) => compose(chain(f), g); @@ -461,7 +461,7 @@ mcompose(mcompose(f, g), h) === mcompose(f, mcompose(g, h)); Bagaimanapun, mereka adalah hukum kategori. -Monad membentuk kategori yang disebut "kategori Kleisli" di mana semua objek adalah monad dan morfisme adalah fungsi yang dirantai. +Monad membentuk kategori yang disebut "kategori Kleisli" di mana semua objek adalah monad dan morfisme adalah fungsi yang di-_chain_. Saya tidak bermaksud mengejek Anda dengan teori kategori bit dan bobs tanpa banyak penjelasan tentang bagaimana jigsaw cocok bersama. @@ -471,7 +471,7 @@ Tujuannya adalah untuk menggores permukaan cukup untuk menunjukkan relevansi dan Monad memungkinkan kita menelusuri ke bawah ke dalam perhitungan bersarang. Kita dapat menetapkan variabel, menjalankan efek sekuensial, melakukan tugas asinkron, semua tanpa meletakkan satu bata di piramida malapetaka. -Mereka datang untuk menyelamatkan ketika suatu nilai menemukan dirinya dipenjara di beberapa lapisan dengan jenis yang sama. Dengan bantuan sidekick tepercaya "runcing", monads dapat memberi kami nilai tanpa kotak dan tahu kami akan dapat menempatkannya kembali ketika kami selesai. +Mereka datang untuk menyelamatkan ketika suatu nilai menemukan dirinya dipenjara di beberapa lapisan dengan jenis yang sama. Dengan bantuan sidekick tepercaya "pointed", monads dapat memberi kami nilai tanpa kotak dan tahu kami akan dapat menempatkannya kembali ketika kami selesai. Ya, monad sangat kuat, namun kami masih membutuhkan beberapa fungsi container tambahan. diff --git a/ch10-id.md b/ch10-id.md index 909e3df9..90979d2e 100644 --- a/ch10-id.md +++ b/ch10-id.md @@ -4,7 +4,7 @@ Nama **functor aplikatif** sangat deskriptif mengingat asal-usul fungsionalnya. Pemrogram fungsional terkenal karena memunculkan nama seperti `mappendor` atau `liftA4` yang tampak sangat alami ketika dilihat di lab matematika, tetapi memiliki kejelasan Darth Vader yang ragu-ragu ketika didorong dalam konteks lain. -Bagaimanapun, nama tersebut harus menjelaskan apa yang diberikan antarmuka ini kepada kita: _kemampuan untuk menerapkan functor satu sama lain_. +Bagaimanapun, nama tersebut harus menjelaskan apa yang diberikan antarmuka ini kepada kita: **kemampuan untuk menerapkan functor satu sama lain**. Sekarang, mengapa orang normal dan rasional seperti Anda menginginkan hal seperti itu? Apa artinya menerapkan satu functor ke functor lainnya? @@ -44,7 +44,7 @@ Bahkan, akan sangat menyenangkan jika kita dapat secara ringkas menerapkan konte https://www.deviantart.com/hollycarden -`ap` adalah fungsi yang dapat menerapkan konten fungsi dari satu fungsi ke konten nilai yang lain. Katakan itu lima kali dengan cepat. +`ap` adalah fungsi yang dapat menerapkan konten fungsi dari satu functor ke konten nilai yang lain. Katakan itu lima kali dengan cepat. ```js Container.of(add(2)).ap(Container.of(3)); @@ -68,7 +68,7 @@ Container.prototype.ap = function (otherContainer) { }; ``` -Ingat, `this.$value` akan menjadi fungsi dan kami akan menerima fungsi lain sehingga kami hanya membutuhkan `map`. Dan dengan itu kami memiliki definisi antarmuka kami: +Ingat, `this.$value` akan menjadi fungsi dan kami akan menerima functor lain sehingga kami hanya membutuhkan `map`. Dan dengan itu kami memiliki definisi antarmuka kami: > Functor aplikatif adalah pointed functor dengan method `ap` @@ -123,7 +123,7 @@ Kedua panggilan `Http` akan terjadi secara instan dan `renderPage` akan dipanggi Bandingkan ini dengan versi monadik di mana seseorang harus menyelesaikannya `Task` sebelum tembakan berikutnya. Karena kita tidak memerlukan tujuan untuk mengambil peristiwa, kita bebas dari evaluasi urutan. -Sekali lagi, karena kami menggunakan aplikasi parsial untuk mencapai hasil ini, kami harus memastikan bahwa adalah `renderPage` kari atau tidak akan menunggu kedua `Tasks` smapai selesai. +Sekali lagi, karena kami menggunakan aplikasi parsial untuk mencapai hasil ini, kami harus memastikan bahwa `renderPage` adalah kari, jika tidak, tidak akan menunggu kedua `Tasks` sampai selesai. Kebetulan, jika Anda pernah melakukan hal seperti itu secara manual, Anda akan menghargai kesederhanaan yang menakjubkan dari antarmuka ini. Ini adalah jenis kode indah yang membawa kita selangkah lebih dekat ke singularitas. diff --git a/ch11-id.md b/ch11-id.md index c59cae92..0c315e8c 100644 --- a/ch11-id.md +++ b/ch11-id.md @@ -28,7 +28,7 @@ Sampai sekarang, kami telah berhasil menghindari skenario umum ini dengan contoh Jika kita tidak mengatur tipe kita dengan cermat saat kita melanjutkan, kode kita akan terbaca lebih berbulu daripada _beatnik_ di kafe kucing. -## A Situational Comedy +## Komedi Situasional ```js // getValue :: Selector -> Task Error (Maybe String) @@ -65,7 +65,7 @@ Kita dapat menyusun jenis-jenisnya menjadi satu wadah yang mengerikan, menyortir Tranformasi alami adalah "morphism antara functors", yaitu, fungsi yang beroperasi pada wadah sendiri. -Ketik, itu adalah fungsi `(Functor f, Functor g) => f a -> g a`. Yang membuatnya istimewa adalah kami tidak bisa, dengan alasan apa pun, mengintip isi functor kami. +Ketik, itu adalah fungsi `(Functor f, Functor g) => f a -> g a`. Yang membuatnya istimewa adalah kami tidak bisa mengintip isi functor kami, dengan alasan apa pun. Anggap saja sebagai pertukaran informasi yang sangat rahasia - kedua pihak tidak menyadari apa yang ada di dalam amplop manila yang disegel yang dicap "sangat rahasia". @@ -167,7 +167,7 @@ Q.E.D. `Promise` dan `Task` yang isomorfik. Kami juga dapat menulis `listToArray` untuk melengkapi `arrayToList` dan menunjukkan bahwa mereka juga. -Sebagai contoh tandingan, arrayToMa`ybe bukan isomorfisme karena kehilangan informasi: +Sebagai contoh tandingan, `arrayToMaybe` bukan isomorfisme karena kehilangan informasi: ```js // maybeToArray :: Maybe a -> [a] diff --git a/ch12-id.md b/ch12-id.md index 1c52aa3f..27fb2aff 100644 --- a/ch12-id.md +++ b/ch12-id.md @@ -1,6 +1,6 @@ # Bab 12: Melintasi Batu -Sejauh ini, di _cirque du conteneur_, Anda telah melihat kami menjinakkan functor [functor](./ch08-id.md#functor-pertamaku) yang ganas, membengkokkannya sesuai keinginan kami untuk melakukan operasi apa pun yang sesuai dengan keinginan. +Sejauh ini, di _cirque du conteneur_, Anda telah melihat kami menjinakkan [functor](./ch08-id.md#functor-pertamaku) yang ganas, membengkokkannya sesuai keinginan kami untuk melakukan operasi apa pun yang sesuai dengan keinginan. Anda telah terpesona oleh juggling banyak efek berbahaya sekaligus menggunakan fungsi [aplikasi](./ch10-id.md) untuk mengumpulkan hasilnya. @@ -136,7 +136,7 @@ Jika saya memiliki `[Maybe a]`, itu adalah kumpulan nilai yang mungkin, sedangka Yang pertama menunjukkan bahwa kita akan memaafkan dan mempertahankan "yang baik", sedangkan yang kedua berarti itu adalah tipe situasi "semua atau tidak sama sekali". -Demikian juga, `Either Error (Task Error a)` bisa mewakili validasi sisi klien dan Task Error (Either Error a)bisa menjadi sisi server. Tipe dapat ditukar untuk memberi kita efek yang berbeda. +Demikian juga, `Either Error (Task Error a)` bisa mewakili validasi sisi klien dan `Task Error (Either Error a)` bisa menjadi sisi server. Tipe dapat ditukar untuk memberi kita efek yang berbeda. ```js // fromPredicate :: (a -> Bool) -> a -> Either e a @@ -179,13 +179,13 @@ Fungsi reduce adalah `(f, a) => fn(a).map(b => bs => bs.concat(b)).ap(f)`, yang 2. `of(new List([]))` -Nilai benih adalah `of(new List([]))`, yang dalam kasus kami adalah `Right([]) :: Either e [a]`. Perhatikan bahwa `Either e [a]` itu juga akan menjadi tipe hasil akhir kita! + Nilai benih adalah `of(new List([]))`, yang dalam kasus kami adalah `Right([]) :: Either e [a]`. Perhatikan bahwa `Either e [a]` itu juga akan menjadi tipe hasil akhir kita! 3. `fn :: Applicative f => a -> f a` Jika kita menerapkannya pada contoh kita di atas, `fn` sebenarnya `fromPredicate(f) :: a -> Either e a`. - > fn(a) :: Entah ea + > fn(a) :: Either e a 4. `.map(b => bs => bs.concat(b))` @@ -193,7 +193,7 @@ Nilai benih adalah `of(new List([]))`, yang dalam kasus kami adalah `Right([]) : Dalam hal ini fungsi memiliki satu parameter `(b)`, dan mengembalikan fungsi lain (`bs => bs.concat(b)`, di mana `b` dalam ruang lingkup karena closures). Ketika `Left`, nilai kiri dikembalikan. - > fn(a).map(b => bs => bs.concat(b)) :: Entah e ([a] -> [a]) + > fn(a).map(b => bs => bs.concat(b)) :: Either e ([a] -> [a]) 5. `.ap(f)` @@ -205,7 +205,7 @@ Nilai benih adalah `of(new List([]))`, yang dalam kasus kami adalah `Right([]) : Ketika `Left`, nilai kiri (dari langkah sebelumnya atau iterasi sebelumnya masing-masing) dikembalikan. - > fn(a).map(b => bs => bs.concat(b)).ap(f) :: Entah e [a] + > fn(a).map(b => bs => bs.concat(b)).ap(f) :: Either e [a] Transformasi yang tampaknya ajaib ini dicapai hanya dengan 6 baris kode yang sangat sedikit di `List.traverse`, dan diselesaikan dengan `of`, `map` dan `ap`, jadi akan berfungsi untuk semua Fungsi Aplikatif.