 Selamat pagi semua, terima kasih kerana bercakap dengan saya hari ini. Saya akan bercakap tentang kelas tipe dan fungsi. Sebenarnya, semuanya berkaitan dengan skala. Kadang-kadang saya akan berkaitan dengan jawa. Okey, mari kita mulakan. Jadi, siapa saya dan saya? Saya ialah Tequie. Saya berdua dengan sebuah komponi software yang memperkenalkan platform debs trading. Saya bermain dengan... Saya perlukan pengenangan pengenangan kelas, ketika saya memulinkan pengenangan pengenangan pengenangan pengenangan pengenangan scarah. Dan pada masa itu, saya adalah pengenangan jawa. Sekarang, skala sudah keluar. Itu mempunyai perkara yang berbeda tapi bukan berbeda. Dan ada satu perkara yang menarik. Jadi, apabila saya menikmati secara perkenalan, Ia adalah perkara yang menghubungkan pengalaman fungsi. Apabila saya menghubungkan, saya dapat tahu bahawa Scala, dan lainnya, Haskell, bagaimanapun. Selepas itu, saya memperkenalkan bahawa saya lebih suka menggunakan bahagian dengan bahagian yang menggunakan bahagian. Jadi, saya hanya menghubungkan bahagian. Baiklah. Untuk kata-kata ini, ia bukan menggunakan bahagian yang menggunakan bahagian di Scala Z. Ini mengenai mengapa anda perlukan bahagian. Dan nampaknya, setelah menggunakan bahagian ini, anda mungkin dapat melihat pengalaman fungsi Scala, dan membuat pengalaman fungsi dan bagaimanapun, bagaimanapun ini menggunakan bahagian. Ini adalah bahagian informasi. Jika anda ada kesilapan atau ada sengaja bahagian saya, anda akan tahu. Dan sehingga anda ada pertanyaan, anda mungkin akan menjawab jika ia adalah sebuah yang lama, anda mungkin akan dapat menyebabkan kejadian. Terima kasih. Jadi, bahagian yang menggunakan bahagian adalah kelas yang mencari, monat, fungsi, dan banyak monat. Sebenarnya, anda dapat melihat bahagian yang berkaitan, kelas yang mencari dan fungsi. Monat, fungsi, dan semua ini adalah kelas yang mencari. Okey, jika anda tidak mengenal kelas yang mencari, kelas yang mencari, jika anda mempunyai kelas yang mencari, anda akan datang daripada pengalaman objek. Jadi, jika anda datang dari Jawa, anda menggunakan banyak pengalaman apabila anda datang ke Spring. Kami menggunakan pengalaman Spring. Jadi, perkara yang terbaik mengenal pengalaman, anda akan bercakap tentang IOC. Ia sangat menggunakan untuk kami. Klas yang mencari tidak terlalu berbeza daripada kelas yang mencari, dan ia sebenarnya mempunyai IOC, tetapi di istimewa anda akan melihatnya semasa pengalaman objek. Jadi, anda akan mempunyai kelas yang salah semasa pengalaman objek. Kemudian pengalaman objek akan mengusahkan dan memperkenalkan pengalaman objek. Jika anda mempunyai pengalaman objek, apabila anda memperkenalkan pengalaman objek, dan kemudian anda akan mengatakan bahawa pengalaman objek pengalaman objek tidak menyebabkan atau tidak memperkenalkan pengalaman objek. Klas yang mencari jika anda tidak memperkenalkan pengalaman objek, ia akan beritahu anda. Jadi, anda tidak perlu memperkenalkan pengalaman objek. Sebenarnya, jika anda memperkenalkan pengalaman objek, anda tidak akan mempunyai jika anda memperkenalkan pengalaman objek, jika anda memperkenalkan pengalaman objek, anda tidak akan memperkenalkan pengalaman objek. Jika anda memperkenalkan pengalaman objek, anda tidak akan memperkenalkan pengalaman objek. Jika anda memperkenalkan pengalaman objek, anda tidak akan memperkenalkan pengalaman objek. Jika anda memperkenalkan pengalaman objek, anda tidak akan memperkenalkan pengalaman objek. Jika anda memperkenalkan pengalaman objek, anda tidak akan memperkenalkan pengalaman objek. Jika anda memperkenalkan pengalaman objek, anda tidak akan memperkenalkan pengalaman objek. B. Jadi jika kita ambil list, kadang-kadang kita mahu membandingkan size yang lebih besar. Jadi kita ambil, bagi contoh, max 1, double, 2, double. Jadi jawapan adalah 2, double. Max 1 integer dan 2 integer. Tetapi kita masih dapat double. Kerana ini adalah polymorphism. Jadi mari kita ambil list. Tapi perkara tentang sini adalah... Baiklah. perkara yang saya tidak suka adalah... ...dia akan memberikan integer. Dan anda dapat double. Ia tidak bermakna besar. Ini hanya sebuah nombor. Apa yang berlaku? Anda mempunyai objek lebih kompleks. Jadi jika anda menggunakan type class... ...saya akan menunjukkan diri. Di sini, bagaimana kita menggunakan... ...yang berlaku di red dot. Jadi kita menggunakan A dan A adalah... ...saya akan menunjukkan type. Untuk menunjukkan... ...saya akan menunjukkan... ...saya akan menunjukkan... ...saya akan menunjukkan... ...tidak seperti... ...yang ada order. Baiklah. Bagaimana anda mahu membuat periuk. Demi periuk adalah periuk. Ada yang terkenal di skala... ...di skala ada objek. Skala dikakis adalah stumble-sign. Beberapa periuknya... ...berbeza dari ordering. kemungkinan yang anda sebenarnya mempunyai, untuk mempunyai, anda tidak mempunyai mempunyai. Jadi efektifnya adalah apabila anda mendapat sebuah max 1, 2, 2, anda akan mendapat 2, anda akan mendapat sebuah max dengan sebuah integer 2 dan 1, kemudian anda dapat 2. Sama dengan string, kemudian, tentu saja, a, a, small letter a adalah lebih besar daripada capital B. Baiklah, kemudian anda akan datang ke list ordering. Jadi, ini adalah tentang order by list size. Semuanya adalah dalam menu skala. Jadi, ini adalah cara skala membuat kelasan. Baiklah, ini adalah sesuatu seperti, saya ingin menghubungi dua objek. Bagi jawa, kita ada perkara seperti ini. Kita ingin menghubungi dua perkara. Ini adalah kes yang mudah. Di mana dua integer berkaitan bersama, dua string berkaitan bersama, dan kadang-kadang, apabila anda mempunyai skala pertama, saya ada masalah seperti ini. Saya mempunyai nama yang sama, tapi ia berbeda dengan cara yang mempunyai kelasan. Kerana JVM, ia akan menghubungi apa-apa parameter kaitan. Selepas kelasan, ia akan berakhir dengan objek. Jadi, kelasan tidak menolak anda melakukannya. Tapi hanya mengharapkan bahawa anda boleh melakukannya. Bagi sekarang, apa yang anda lihat di sini, anda akan mempunyai dua perkara yang berbeda dengan dua string berkaitan bersama. Dan dua string berkaitan bersama. Jadi, jika anda ingin melakukannya, anda akan mempunyai satu perkara. Jadi, bagaimanapun perkara yang anda perlu mempunyai? Jadi, dua x dua adalah empat perkara. Bagi sekarang, saya akan mempunyai sebuah perkara. Mungkin sebuah bulian. Jadi, dua x tiga adalah enam. Ia adalah produk kartisan. Jadi, apabila anda datang ke kelasan, pertama, anda menghubungi kelasan, kelasan. Kemudian anda mempunyai perkara yang berbeda dengan kelasan. Sebenarnya, kerja sebenarnya adalah pada kelasan yang penting. Tapi A, apa yang A? Anda tidak tahu apa yang A. Tetapi perkara itu adalah perkara yang penting. A dan B. Maksud saya, apa yang A? Maksud saya, apa yang A? Apa yang A? Sebelumnya, kita mempunyai apa yang A? Di sini, kita menggunakan implisit untuk membuat begitu. Sebab itu, bagaimana perkara ini menghubungi di sini. Dan di sini, bagaimana perkara ini menghubungi? Jadi, anda menggunakan implisit dalam parameter dan anda menghubungi value implisit. Di sini, kita mempunyai indijer-indijer A dan B. Ini adalah A dan B adalah kondensi kondensi kondensi. Dan akhirnya, kita mempunyai penderbangan ini. Kita mempunyai penderbangan ini. Kemudian, saya akan beri kemudian. Sebenarnya, jika saya mahu membuat penderbangan ini, jadi setelah saya mempunyai ini, saya dapat mempunyai kondensi yang sama seperti yang saya mempunyai. Jadi, jika saya memperbaiki penderbangan dengan bar, ia masih berlaku. Kerana setelah saya membuat penderbangan ini, A adalah kondensi A dan B. Dan A di sini, A di sini akan menjadi kondensi. Ini sebenarnya pada masa kondensi. Jadi, kondensi akan mencari kondensi. Jadi, perkara yang terdapat saya mahu buat adalah kondensi. Oh, okey, saya mahu menghubungi kondensi. Sama dengan indijer. Kita meminta kondensi. Kondensi A dan B, saya akan kembali kemudian. Kondensi A dan B, saya akan kembali kemudian. Jadi, saya akan beri kondensi yang benar. Jadi, jika saya mempunyai kondensi, saya akan beri kondensi. Jadi, okey, jika anda mempunyai kondensi ini, ini sedikit berbeza. Kadang-kadang ada kondensi, anda mahu membuatnya berbeza. Anda mahu menghubungi kondensi dua kondensi, okey? Atau anda mahu menghubungi kondensi ini. Maaf, ini sebenarnya sekarang saya bercakap tentang bar. Bersiapkan bar fungsi di sini. Tapi, kita ada kondensi yang sama. Jadi, anda ada kondensi 1, 2, 3 dan kondensi 4, 5, 6. Jadi, apa yang kita lakukan di sini adalah, kita mahu menambahkan kondensi setiap alam. Jadi, anda dapat kondensi 5, 7, 9. Tapi kadang-kadang anda tidak mahu lakukannya. Anda mahu sebenarnya menghubungi kondensi. Di sini, kondensi 1 dan kondensi 2, anda menghubungi kondensi 3. Jadi, anda dapat kondensi 1, 2, 3. Jadi, ia sangat bergantung pada bagaimana anda menghubungi kondensi di sini. Anda mahu menghubungi kondensi, atau anda mahu menghubungi kondensi setiap alam-alam. Ini adalah implementasi. Anda menggunakan kondensi dan anda menggunakan kondensi. Anda dapat menambahkan alam bersama-sama. Ada sebuah pertanyaan di sini? Okey. Selanjutnya, kita ada masalah ekspresi. Masalah ekspresi adalah sesuatu yang, di setiap alam, anda ingat bahawa jawa ada alam-alam. Jadi, jawa ada alam-alam, jawa ada alam-alam. Jawa ada alam-alam, jawa ada alam-alam. Jadi, jika anda mahu menambahkan satu alam-alam, atau anda mengubah sesuatu dalam alam-alam, anda perlu mengubah dalam alam-alam. Jadi, kadang-kadang ia bergantung, kadang-kadang ia tidak bergantung bagaimana alam-alam yang digunakan dan siapa yang menggunakan alam-alam. Jadi, anda mungkin pada kadang-kadang anda tidak menggunakan alam-alam, seseorang menggunakan alam-alam. Apabila ia berubah, anda perlu mengubah. Jadi, kadang-kadang ia bergantung. Okey. Dalam alam ini, saya menggunakan alam-alam sebagai alam-alam ini, atau alam-alam. Jadi, alam-alam bergantung dan menggunakan alam-alam atau menggunakan alam-alam. Jadi, saya akan mengambil alam-alam sebagai alam-alam, alam-alam api, alam-alam orang, dan alam-alam biasa, alam-alam. Jadi, alam-alam terakhir ia bergantung untuk membuat alam-alam atau untuk memasukkan alam-alam. Tapi, alam ini adalah bergantung. Ini adalah alam-alam. Jadi, ia mengubah. Jadi, ia bergantung. Baiklah. Kemudian apa yang berlaku jika anda mempunyai yang anda ingin mempunyai pada hari itu, anda akan mempunyai alam-alam XML. Sekarang, anda mempunyai alam-alam jazon. Jadi, anda ingin mempunyai alam-alam jazon. Jadi, alam-alam ini anda perlu mempunyai alam-alam terakhir, dan apa-apa yang di bawah itu perlu diubah. Alam-alam perlu diubah, alam-alam perlu diubah. Baiklah. Dan, bagaimana anda mahu alam-alam, anda tidak mahu memasukannya alam-alam jazon, tetapi anda tetap mempunyai alam-alam jazon. Dan, alam-alam terakhir, anda tidak dapat mengubah kerana anda tidak mempunyai alam-alam jazon. Jadi, alam-alam ini anda hanya mempunyai alam-alam yang lain untuk membuat itu. Baiklah. Jadi, bagaimana kita memasukannya adalah, anda menggunakan alam-alam jazon. Kemudian, alam-alam, anda mempunyai alam-alam dan alam-alam lagi. Jadi, apa yang saya buat sekarang adalah, ini, jalan-jalan-jalan akan adalah alam-alam alam-alam yang saya mempunyai. Jadi, apabila kita pertama, kemungkinan pertama adalah, okey, anda perlu memasukkan alam-alam jazon dan alam-alam jazon. Baiklah. Baiklah. Baiklah. Baiklah. Baiklah. Baiklah. Baiklah. Baiklah. Baiklah. Membasukkan dengan alam jadi, anda harus memasuki alam-alam. Untuk alam, anda ada alam. Bagaimana anda membayar angin alam dalamksi alam? Kemudian yakin anda mempunyai SMA. Bagaimana anda membayar BOX WordPress lalumu kearesan maaf coy cycles barat here. Ada inputs di Alam Baiklah. Kemudian, kita mempunyai jason serisasi. Di sini, saya akan menambahkan jason yang lain. Maaf, saya mempunyai interface baru yang sama seperti ini. Saya mempunyai ini dan saya tidak perlukan orange. Orange tidak perlukan jason. Saya dapat mengubah itu. Untuk jason, walaupun saya tidak mempunyai kode sos, saya dapat memperkenalkan jason. Untuk jason, saya mahu memperkenalkan jason atau jason. Sekarang tidak bergantung jika ia mempunyai jason. Jadi, jason adalah cara untuk mengusahkan hal yang dikenalkan. Jangan terdapat jason di sini. Semua jason. Jangan terdapat jason dan jason. Jangan terdapat jason. Jangan terdapat jason. Awak dapat melihat di sini, jangan terdapat jasonönya. Bagus menyebabkan jason. Memang di sini. Macam mana lagi yang anda mahu membuat? Baiklah. Ada gotaid? Okey, di sini. Jangan bercakap tentang jason. Saya rasa saya akan memutuskan dengan ini. Jika anda mempunyai satu, dua, tiga, anda mempunyai setiap element yang diperluatkan dengan satu. Jika anda mempunyai lembaga, anda mempunyai lembaga. Jika anda mempunyai lembaga, anda mempunyai sebuah tarikh. 98, 99, 900 adalah tarikh dari BCDA. Jadi, pilihan yang sama, anda mempunyai lembaga. Baiklah. Jadi, ini sebenarnya, anda tahu kenapa ini tidak... Kenapa ini ada sebuah area kompalasi di sini? Ada sesiapa? Kerana ini sekarang terakhir, jadi tidak ada apa-apa. Ya, betul. Bagus. Baiklah. Di sini. Bagaimana jika saya mempunyai sebuah kelas yang saya mahu mempunyai? Maksud saya, mempunyai sebuah kelas yang sangat baik untuk digunakan. Tetapi saya tidak dapat mempunyai sebuah kelas yang tidak mempunyai sebuah kelas yang tidak mempunyai sebuah kelas yang tidak mempunyai. Dan anda tidak dapat mengubahnya. Dan ini juga dapat mengubah kelas yang terakhir. Anda tidak dapat mengubahnya. Jadi, apa yang anda boleh lakukan? Saya mungkin memasukkan itu. Saya tidak tahu. Sebelum saya mempunyai kelas yang terakhir, saya mahu bercakap tentang sebuah kelas yang lebih baik. Jadi, kelas yang terakhir adalah... Jika anda melihatnya, kelas yang sebenarnya adalah sebuah kelas yang terakhir. Apa sebuah kelas yang terakhir? Kelas yang terakhir adalah seperti... Sebenarnya, ia bukan kelas yang terakhir. Ia membutuhkan kelas yang terakhir untuk menjadi kelas yang terakhir. Jadi di sini, seperti yang saya katakan di sini, kelas yang terakhir, semua kelas yang terakhir, kelas yang terakhir adalah sebuah kelas yang terakhir. Kerana ia tidak terakhir. Ia masih mempunyai kelas yang terakhir. Jadi, kelas yang terakhir adalah... ...saya dapat mengubah kelas yang terakhir. Sebelum kelas yang terakhir diain近 dari kelas yang terakhir... ...sampai ia sedang membuat kelas yang terakhir untuk menjadi kelas yang terakhir. Jika kita tidak sebaiknya disediakan kelas yang terakhir... ...saya dapat mengidap kelasР. Jika kita membuat kelas yang terakhir, Technically NoteFeline akan mengukam kelasי sidang kelasit... ...saya akan mengsom Såg fer. Sada sebuah kelas yang terakhir adalah sebuah kelas... It's just abstract. You also have another abstract which we are going to fill in with implicit later as we did before with previous examples. So say I have a bonus class. A is again a type variable. So I have a function tax 10, tax 20. Basically, it's a very simple implementation. Then there's something mapable that says that I give a map functionality to something. As you see earlier, here, like appendable, I can make something that to combine. It's like an interface. When you inherit an interface, you get that power. So same here, appendable, if I include appendable in my functions, I will get that power, whichever you include in. So here I'm giving something that map capability to a container, for example. So bonus actually is a container because it contains something which is a variable. So as we go down, then you see that I just implement bonus. How do I do? How do I deal with bonus? Map is just go from, okay, I have two variable here, A and B. So here it just says that F A is a type of bonus A. The next thing is the function, F is A to B, and the return value is bonus B. So here I already cut down F. I already say that F is fixed to bonus for mapable. So the last variable here, the type variable is A and B, which is going to fill in when you make the call. Again, you must have one function here to include the mapable. So you take in A and B. So this is just a function for calculation for bonus. It's whether you get a bonus or not. Don't read too much into the implementation. It's just a simple implementation. So how we're going to use it is, okay, here, sorry. So the first thing is, I want to create, what do I get a cash bonus for year 2000? Here. So it's my year, it's an even year. I will get $101. So or else I will get a zero. So here will be, I will get a bonus of 101. So what's next? I tax. You run a function against that bonus. So here B is the double inside. So if you see here, these two are interlink because of this implicit. So here, you look at here FA, which is your bonus. F is your function. So again, how they are, you break down further. How is it going to be? You take the amount, FA now become bonus dot amount, which is here. F is tax 10. Take a double and tax if it's above 100, it will tax 10%. So you return A, a double and you end up with bonus 90.9 because once this function executed, you left with 90.9 and you go back to bonus. The final answer, the final class, the final result that exists, that return from there is bonus 90.9. Follow. A few indirection point. So this one is the same. If I do the same thing, but I use a different formula. So here you see that let's say I have another class. Share. This go by, not money by units for example. Same thing if it is or even year, I will get a bonus share of 1000. So I do the same here. If I want to get back the amount of money I get tax, the amount of money that after tax. So this is what I do. First I will do this. Share of this. Then each share say, this unit say that each share is $20. So year 2000, bonus share 2000, share bonus for year 2000 is 1000 shares multiply by 20. So you get 20,000 and you tax the 10%. I think the function name is wrong. You tax 10%. So that's your answer. But this one look a bit a bit clumsy. So we can improve it. We can actually use implicit class to actually change, make the class to be mappable so that you could write something like this. Cash bonus for year 2000. You mapp, then you tax it, then you you get your final answer. Final, what's your cash after tax? So you see this is something similar to what we had before, the lease. It's very easy to follow here. So the whole chunk of this is to make it readable. Why we go through the trouble is because sometimes you can't change bonus, you can't change share. This object doesn't belong to you. Or maybe it's already too deep rooted that it's very risky to change. So this outside of whatever it is it has its own so far okay. So the same for share bonus. If you want to mapp, I do twice, like same here, there's two F mapp here. We're doing twice and here I can mapp twice. First I mapp, I want to calculate how much a unit and the next mapp is to tax the amount. Any question? Okay. So we look at the next one, binable, which extend from mappable. So again these are the something called flat mapp, pure and mapp. Mapp is a familiar one. It comes from mappable. So basically you just mapp something. So what is not implement is flat mapp and pure. Okay. Can I interrupt you for a moment? Okay. So maybe you're covering this later on and if you are, stop me. Okay. But I get the impression that now you're kind of explaining the high classes so that you can show how these are used in cats. Yes. Further on. Is that right? Yes. Okay. So if you're going to jump from mappable, which is, I don't want to get ahead of some other, it's call a spade a spade it's a puncture. Okay. So you're going from mappable, which I understand maybe you just want to keep that literal now without conflating terms such as puncture. But you go from that to bindable which now has flat mapp and pure. Hmm. So maybe you want to use the Yes, correct. Yeah, right. Actually I try to find a better word for monad. I couldn't. So I guess bindable someone can relate to it. Okay. Right. Okay. Some people from JavaScript maybe they can relate to it. I couldn't find a better word. I agree with doing that but you might want to just put that connection there. Yes. I would do that. I would do that. Yes. Another folks go out and encounter libraries that have these things. They're not going to see them called mappable and bindable. They're going to see them called category theory. Yes, correct. Precisely. I'm going to clarify that in two more slides. Right. Okay. So we have well, I guess the secret is out. Bindable is a monad. I guess if you know it then you see the signature you know it already. There's no way to hide it. No matter what you call it you say call it a spade. Even if you don't call a spade it's already it's very clear it's a spade. Right. You look at the signatures. So probably the gist of it I think what I'm showing this is I trying the best to explain monad because when I first come to these terms I'm afraid of the term itself. Why a functor not a function? How they are related. So I got scared and then it took me a long time to nail it down. So and then the most important thing what you see here these are the mechanics of it. Right. But what is precisely what you're trying to achieve is you try to make it like this. So that is very is readable. Because the concept once you maybe now it's a bit confusing but once you grab it so you look at this side here is very straight forward. But before you come to here there is this step which quite obvious obvious as in it's already stated in the Scala that this syntax is the this is the sugar coated syntax for this because this once compile this will become this and compile further. These two is equivalent. So the point of all this mappable and bindable functor and monad you come to this conclusion. So basically how you read it is because after you return your code two months, three months down the road only got snow. What is it? So you try to make it as clear as possible so that not just you but most people can understand it. So here basically say I want to share bonus for year 2000. So every share is $20 and I'm going to tax 10%. So what's your final cash value that you have? This thing a bit this pure practically you can read up after this if you are not clear but I hope that end of the day this is your this this works this actually makes it simple for you this syntax. Well I guess if you if you use a lease I think you do without knowing you are using monad let's say you have options options and you you do a fall for comprehension for options right you have whole list of it actually you're doing something monadic but not knowing it but it's quite useful right you don't have to like well if else else if you know that the kind of thing so you don't it's it's easy to read and easy to follow right definitely the first time brown is it's not easy right okay so yep so appendable actually it's monoid Fungto Fungto Fungto is actually a high a kind type means that it's a it's it's type is that the one that it's contained is a container it's a container for a container so it's a higher kind type right monad so it solve type classes solve expression problems well you give it at the exact types that return right I think this one is Jika anda menggunakan numerik, maka skala numerik, anda akan menghargainya. Anda akan mendapatkan alasan yang segera, untuk menerima alasan yang segera. Kemudian yang terakhir adalah... ...untuk dikualifikasi sebagai monoi, fungtor atau monat, anda akan mempunyai keadaan yang anda perlu ikut. Jangan risaukan terlalu banyak ini, kerana anda boleh membaca kemudian. Untuk menggunakan alasan ini adalah kerana, jika anda mempunyai keadaan yang dikualifikasi sebagai monoi, semuanya dengan alasan yang segera, adalah fungtor atau monat. Anda akan mempunyai keadaan yang anda perlu ikut. Jika anda menggunakan alasan itu, mereka adalah fungtor dan monat. Sekarang saya akan bercakap tentang fungsi. Fungus program adalah tentang program dengan fungsi. Kerana semuanya lain, seperti apa-apa pun yang dikualifikasi, keadaan yang segera, keadaan yang segera, sebab... ...sebab tiga keterisian ini. Fungsi segera seharusnya segera, bermaksud, untuk setiap alasan, seharusnya segera. Tidak ada kegagalanan, walaupun itu adalah salah satu. Sebenarnya ia berkata, apa-apa pun yang dikualifikasi dalam parameter, ia hanya menggunakan alasan itu. Atau memilih tidak untuk menggunakan alasan itu, anda memperbaiki lebih banyak yang anda perlukan, tetapi anda tidak dapat menggunakan lebih banyak yang dikualifikasi. Dan tentu saja anda tidak dapat menggunakan alasan, untuk contohnya. Dan keadaan yang dikualifikasi, bermaksud anda selalu menerima alasan yang sama, setiap kali anda menyebabkan alasan itu, setiap kali, setiap kali, setiap kali, ia tetap sama. Jadi ia sangat susah untuk menggunakan alasan itu. Ini adalah fungsi yang mudah, dengan i dan j. Jadi 1 dan 2, 3, 10, 20, 30, 1, 2, 3. Jadi apa yang berlaku jika saya mempunyai, saya rasa, terutamanya kita tidak beruntung, kita hanya mempunyai fungsi yang mudah. Kita mempunyai perkara yang menyebabkan alasan itu seperti anda. Ini adalah fungsi yang saya menyebabkan. Jadi ini adalah fungsi yang mudah. Apabila anda memberi saya 4, saya hanya menyebabkan alasan itu. Saya menyebabkan 1, 1, saya menyebabkan 20, 20, saya menyebabkan 1, 1. Baiklah, saya menyebabkan 4, saya menyebabkan alasan itu. Jadi ia mengubah alasan 1, yang tidak sepatutnya menyebabkan alasan itu. Tapi dalam kes ini, apa yang saya boleh lakukan? Jika anda melihatnya, kerana kadang-kadang, apabila anda menyebabkan alasan itu, jika fungsi ini selalu menerima alasan positif, apa-apa yang tidak sepatutnya saya boleh menggunakan sebagai alasan error, atau alasan error, apa-apa saja. Tapi di sini, anda lihat alasan ini, sebenarnya alasan ini, semua alasan yang diberikan di dalamnya, tidak ada cara untuk menyebabkan alasan yang tidak sepatutnya. Untuk menyebabkan alasan ini, keadaan yang tidak sepatutnya boleh menjadi alasan yang tidak sepatutnya. Jika anda melakukan itu, apa yang saya ada jika saya tidak mahu menggunakan alasan? Jika saya melakukan perkara seperti ini, ia sedia. Jika saya mempunyai alasan 4, saya akan menyebabkan alasan X. Ini adalah alasan yang sedia. Kemudian ia tidak beritahu saya bahawa ia tidak suka alasan 4. Ia hanya menggunakan alasan 4, tetapi ia masih sangat baik. Jadi, kita boleh membuatnya lebih baik. Kita boleh menggunakan alasan. Untuk semua alasan yang anda berikan, saya menerima alasan, alasan X, dan jika saya menerima alasan 4, saya akan menerima alasan. Jadi, anda dapat mencari alasan itu, itu adalah salah. Atau kadang-kadang anda mahu lebih diskriptif, kemudian anda menggunakan alasan. Alasan yang anda dapat, anda dapat menerima alasan diskriptif, seperti ini. Jadi, di sini, tidak perlu anda menerima alasan, anda dapat menerima alasan jika anda mahu. Jadi, dan alasan itu, apa-apa pun, adalah alasan yang betul, anda menerima alasan yang betul. Jadi, di sini saya menerima alasan 4. Lepas, anda menggunakan alasan untuk alasan RMSH. Tetapi lagi, alasan ini adalah salah satu alasan untuk alasan. Tetapi, ia tidak perlu, anda dapat menjadi berdua, berdua adalah betul. Lepas, betul-betul betul-betul betul. Tetapi, seluruhnya, alasan itu adalah bagaimana anda melakukan. Baiklah. Jadi, jika anda kan kanan, anda dapat menerima alasan. Jika anda tinggal, anda akan menerima alasan dan saya akan katakan, anda tidak menerima alasan, anda akan menerima alasan, anda menerima alasan, saya menerima 4. Ia selalu menerima 4, kan? Ya. Ia tidak menerima alasan yang betul, ia tidak menerima 4. Yang mana? Ia adalah di bawah ini. Ya, ini adalah alasan yang betul. Ia berada di bawah ini. Ia berada di bawah ini. Lepas, ia adalah alasan yang betul dan rata 4, kan? Ya. Ya, alasan yang betul dia. Ia harusnya adalah alasan yang betul. Oh, alasan yang betul. Oh, ya. Ya. Saya menjadi seorang orang ini. Bersendirian anda. Baiklah. Saya takkan anda dapat idea. Tapi, ini adalah alasan yang betul. Biasa, idea, kerana pujian idea bukan, anda tak boleh hanya idea dan dot map, anda tak boleh. Tapi anda dapatnya nanti. Jadi apa yang berlaku, jika ketiga parti, saya berhati-hati untuk ketiga parti, tiada apa-apa yang anda boleh lakukannya. Tiada apa-apa yang anda boleh lakukannya. Anda hanya melakukannya. Jika anda tidak melakukannya, anda akan mempunyai dua dan ia adalah sukses. Jika anda melakukannya, ia akan berhenti di sana dan ia akan kembali dengan kesilapan dan saya berhati-hati untuk. Satu-satunya perkara ini adalah, fungsi intensi adalah jelas. Jika anda melihatnya, anda melihat saya berhati-hati untuk pilihan, bermaksud ia adalah peluang yang saya tidak akan menerima. Jika anda melihatnya, jika anda melihatnya, jika anda mempunyai peluang yang saya dapat, jika anda mempunyai peluang yang saya dapat jika anda mempunyai pasangan kisah atau beberapa hal lain. Jadi secara olha, tetap sedia saja, ianya akan menyebabkan. Jadi adalah sebuah monah sebab anda tidak mendengar pahala monah. Walaupun anda mempunyai map dan map addresses, dan ia sudah benar-benar digunakan untuk kita jumpa. Kita tahu apa yang kamu buat di dalam dan kadang-kadang ada eras fringan, kemudian kamu tahu bagaimana untuk mencari. Adakah ia membuatkan kamu bahawa TRI itu bukan monad? Adakah ia membuatkan kamu bahawa TRI itu bukan monad? Tidak. Tidak. Ia tidak. Dan itu merupakan salah satu monad? Sebab sebab semasa TRI mempercayai jawa-kode. Sebab ia adalah sebuah norma di jawa, anda mengambil keputusan. Jadi apabila anda mempercayai jawa-kode atau jawa-librari, anda menggunakan TRI. Jika anda mempercayai, anda menggunakan TRI. Setelah ia keluar dari sana, saya menghubungi sesuatu yang lain. Jadi ia adalah layanan TRI. Semoga keadaan kecil, saya beruntung di sana. Sejauh ini, saya beruntung. Tapi ini adalah perkara lain kerana di JVF, anda tidak boleh melakukannya. Selain Haskell, semuanya daripada jawa-kode, ia berbeza. Mungkin TRI yang lain, natif Scala, mungkin lebih baik. Bagaimana keadaan TRI? Saya tidak pasti. Saya rasa ia sesuatu yang berlaku dengan jawa-librari untuk keadaan. Jawa-librari, anda mengambil keadaan di jawa-librari atau jawa-librari apabila anda mempercayai. Jawa-librari untuk keadaan. Jadi nanti anda akan menunjukkan keadaan? Tidak. Tidak? Tidak, saya tidak. Saya akan mempercayai keadaan. Baiklah. Seperti yang dia cakap, saya tiada masalah. Jadi saya tidak pergi ke situ. Baiklah, mari kita lihat apa yang berlaku. Baiklah. Saya rasa satu perkara yang selalu keluar adalah keadaan. Apabila saya bermula, saya sangat susah untuk saya menggunakan keadaan kerana saya menggunakan keadaan. Saya menggunakan banyak keadaan yang tidak berlaku. Keadaan berlaku adalah berlaku kerana saya terus mengubah keadaan. Jadi ini adalah satu perkara. Ini adalah keadaan Fibonacci. Jadi anda memberikan keadaan 0 dan 1. Kemudian anda akan mendapatkan keadaan listan 0, 1, 1, 2, 3, 5, 8, 13. Tetapi keadaan ini masih sebuah perkara. Kerana keadaan berlaku dikontainan daripada perkara. Ia tidak dapat keluar. Atau anda dapat menggunakan keadaan yang lain dengan keadaan yang lebih mudah. Jadi anda hanya mempunyai keadaan. Saya tidak ingin mengingatkan terlalu banyak tentang keadaan kerana salah satu perkara yang pertama. Jika saya menggunakan keadaan 1 atau 0, saya akan menerima dua perkara untuk anda. Sebenarnya anda akan menerima satu perkara. Jadi 8 di sini bermaksud saya menerima 8 perkara untuk menerima. Jika saya menggunakan keadaan 0 dan 1, anda akan menerima dua perkara. Jadi di sini ini hanya perkara keadaan. Jadi pertama saya memulakan keadaan listan 1 dan 0. Jadi apabila saya menggunakan keadaan listan 3... ...sehingga saya tetap mengguna keadaan dan dikontainan keadaan 1, saya akan menerima keadaan yang saya menerima. Jika tidak, saya akan menerima keadaan keadaan ini kembali ke depan. yang mengalami fitus adalah fungsi yang dalam. Ini adalah fungsi yang penting, ini adalah fungsi yang dalam. Jadi, satu kata minus satu. Jadi, ini adalah kalaman Fibonacci. Kamu pakai A plus B dan A plus B. Teruskan ke kumulator. Baiklah, kita teruskan sampai kumpulan lebih daripada satu, kemudian kita akan pulang ke kumulator. Tetapi jika kamu pulang ke kumulator, masalahnya adalah cara kamu menambahkan, kamu dapat melihat bahawa ini sebenarnya 138532110. Jadi, saya melakukan perubahan dan saya dapat ini. Baiklah. Jadi, tanpa membuat ini, jika kamu perlu, cuba melakukan ini. Ini sebenarnya menggunakan perubahan. Baiklah. Kemudian lebih baik, kamu menggunakan fungsi built-in. Baiklah. Lazilys adalah, saya tidak ingat apa-apa pun ini, tetapi jika kamu melihat stream, Lazilys adalah replacement stream untuk Scala2013. Ia bekerja di atas tinggi, bekerja seperti stream. Baiklah. Jadi di sini, saya mengatakan bahawa saya akan mulakan dengan 0. Saya akan mulakan dengan 1. Saya akan menambahkan dua ini bersama dan membuat alamat ketiga. Di sini, saya akan kembali kembali ke dalam ini. Jadi, saya rasa kamu mengambil sedikit acrobaks untuk mengambil acrobaks saya untuk cuba mengambil ini. Saya ada masalah mengambil ini tetapi, apa yang saya cuba katakan di sini adalah jika kamu mempunyai fungsi built-in, menggunakan fungsi built-in. Jangan melakukan kembali. Jika kamu melakukan kembali, hanya kamu perlu. Dan bagaimanapun, kamu perlu menggunakan variable mutabila, tergantung. Jadi, sebab jika kamu menggunakan fungsi built-in, kamu akan mendapat bonus seperti, bagaimanapun, kamu ingin mempunyai alat-alat Fibonacci yang kurang lebih daripada 2 milion. Jika jika kamu kembali ke dalam ini, jika dengan alat-alat fungsi ini, saya akan mempunyai saya akan melakukannya sendiri. Jadi, kenapa tidak, saya hanya menggunakan fungsi built-in. Kerana fungsi built-in berkata, mereka menggunakan banyak fungsi fundamental untuk kamu supaya kamu boleh membuat mereka berkata, berkata dan berkata. Okey. Jadi, bagaimanapun, fungsi berkata-kata dan berkata-kata, fungsi berkata-kata adalah lebih mudah untuk melakukannya kerana semua alat-alat semua parameter ada. Jadi, menggunakan alat-alat fungsi built-in, apabila tidak mungkin, jika kamu menggunakan fungsi berkata-kata. Okey. Jadi, apabila fungsi berkata-kata tidak mengambil alat atau tidak mengubah alat, sebaiknya mereka di alat-alat fungsi, kerana ia tidak membuat perlukan maksud untuk tidak mengubah apa-apa atau tidak menggabungkan apa-apa. Jadi, tetapi kemudian, alat-alat fungsi berkata-kata tidak menggunakan. Mereka membuat alat-alat fungsi. Jadi, apa yang akan kita lakukan? Jadi, alat-alat fungsi ini tidak mempunyai, alat-alat saya mempunyai alat-alat, seperti contohnya, saya dapat mempunyai alat-alat antara 1-10. Di sini, alat-alat saya dapat mempunyai sesuatu. Punyai tidak mempunyai, mencari alat untuk alat tidak memunyai. Kemudian di sini, saya dapat membuat alat-alat. Jadi, apa yang ini memunyai? Saya tidak menjawab jawapan. IOMONA IOMONA adalah melihatnya berbeda. IOMONA adalah sebuah kemampuan, tapi saya melihatnya sebagai kemampuan apabila alat-alat fungsi berakhir dan kemampuan tersebut bermula. Jadi, di mana anda melihat alat-alat fungsi tersebut adalah kemampuan yang sangat jelas. Maksudnya, alat-alat anda dapat atau tidak. Alat-alat anda akan dapat sesuatu atau anda akan dapat sebuah alat lain. Jadi, alat-alat IOMONA bermaksud bahawa, oh, okey, alat ini akan membuat IOMONA. Jadi, alat ini, alat IOMONA sebenarnya adalah sangat mudah. Anda hanya mempunyai alat, anda mempunyai alat-alat dan alat ini adalah implementasi. Kemudian jika saya meletakkan sesuatu untuk meletakkan alat, saya akan meletakkan di dalam IOMONA dan saya meletakkan. Jika saya meletakkan sesuatu daripada alat, saya meletakkan alat dalam IOMONA. Tetapi satu perkara yang anda melihat adalah, alat ini adalah alat fungsi tersebut. Mereka tidak dihubung dengan cepat. Jika anda melihat di sini, alat ini, ini bermaksud bahawa anda perlu mengambil alat sebelum sebenarnya ia memiliki alat. Alat ini, alat ini tidak memiliki alat. Oleh itu, sebab alat ini tidak penting jika anda adalah monad atau tidak, alat ini berhasil sejauh sejauh sejauh sejauh jika anda mempunyai alat dan alat itu. Jadi, alat ini adalah siapa anda? Jadi anda melihat alat ini dan pergi ke sini dan ia berkata, Prin, siapa anda? Jadi, alat ini adalah alat yang memiliki alat. Jadi kemudian anda dapat nama, alat ini adalah alat, alat ini adalah alat yang memiliki alat yang sejauh sejauh sejauh sejauh. Tetapi lagi, alat ini belum digunakan. Alat ini masih ada alat atau, dalam kes ini, alat ini adalah alat. Ia masih belum digunakan lagi. Jadi, untuk digunakan, anda perlu berkata alat yang tidak selamat. Alat ini, alat ini adalah sangat, sangat, sangat mudah untuk sebenarnya anda menggunakan alat yang memiliki alat kerana ada banyak perkara lain yang digunakan. Kerana jika anda menggunakan alat ini, alat ini dapat digunakan ke sejauh sejauh, dan kadang-kadang anda terlalu terdengar dalam alat yang memiliki alat, anda akan mendapat alat. Saya bercakap tentang, bukan 10, 20, tapi anda memiliki alat, kerana program fungsi adalah tentang membuatkan alat. Kadang-kadang anda tidak tahu seberapa saya membuat alat. Jadi, ia dapat menjadi sangat terdengar sebelum anda sebenarnya memiliki alat. Jadi, anda menggunakan alat I.O. atau alat I.O. ia sebenarnya menjaga semua perkara ini untuk anda. Jadi, alat ini hanya untuk keputusan ilustrasi, keputusan ilustrasi. Tapi fungsi adalah sama. Okey, bagaimana kita menggunakan alat ini? Jadi, saya ada alat random, alat random, alat random, lagi alat random adalah tidak sepatutnya. Kenapa? Kerana ia selalu menerima alat yang berbeza. Jadi, di sini saya memasukkan alat random, tergantung pada bulian. Jadi, alat ini adalah sebuah fungsi sendiri. Jadi, saya sebenarnya memutuskan alat kedua. Jadi, alat kedua ini adalah alat kedua. Saya mahu seseorang menggunakan alat. Okey, nama seseorang, mengambil alat yang merah atau merah. Jadi, di sini saya mengharapkan dia atau dia untuk memasukkan alat merah atau merah. Jadi, jika alat ini adalah apa, apa alat ini adalah alat di sini, kemudian saya memutuskan alat. Jadi, saya tidak melakukan apa-apa. Sebenarnya, saya tidak melakukan apa-apa. Dan lainnya, saya memasukkan alat yang berbeza, pergi ke sini, dan menerima lagi. Jadi, sekarang saya mahu memasukkan alat. Jadi, bagaimana saya membuat dua ini bersama? Tiga fungsi ini bersama. Saya mempunyai alat. Saya mempunyai alat yang merah atau merah. Dan kemudian saya mempunyai alat lagi. Ia belum dimasukkan. Jadi, apabila saya memasukkan alat, di sini, ada John Doe, Helo John Doe, dan anda memasukkan alat. Jadi, sekarang sistem, sistem telah memasukkan alat, tetapi anda memasukkan alat. Jadi, anda kembali lagi dan memasukkan alat lagi, dan kembali alat, dan kemudian ia memasukkan fungsi. Jika anda terus memasuk alat, anda akan terus memasukkan alat. Ini adalah satu komposisi yang mudah. Jadi, kemudian, alat tidak hilang, anda masih boleh memasuk alat. Kemudian alat lebih mudah, hanya memasukkan dua langkah. Dapat nama, alat selesai, selesai. Jadi, saya memasukkan satu masalah yang sangat penting untuk saya, yang adalah log-log-log. Kerana log-log adalah impu dan saya dapat melakukan itu. Ini sangat seperti alat jawa, anda dapat log-log, dan kemudian anda memasukkan alat, dan kemudian anda melakukan alat selesai, fungsi yang terbelakang, anda dapat nama, lepaskan alat, anda memasukkan alat selesai, dan anda memasukkan impu lagi ke dalam alat selesai. Kemudian anda memasukkan alat. Kemudian, tentu saja, ada beberapa yang lebih suka menggunakan alat, alat atau tidak. Kita mengatakan bahawa, apabila anda memasuk alat, terma monat sebenarnya memberi anda alat untuk memasuk alat dan memasuk alat. Memang memasuk alat, bermakna bahawa dia akan memasuk alat selesai alat. Di sisi lain, alatnya hanya akan memasuk alat. Jadi, kita akan memasuk alat. Jadi, anda melihat alat yang sama. Jadi, kita akan kembali ke alat yang sama, alat yang sama, alat yang sama. Jadi, alat yang sama di sini, saya mempunyai alat selesai dan memasuk alat selesai, dan alat selesai. Alat selesai, alat selesai bermakna, hanya memasuk alat, hanya memasuk alat selesai. Saya akan memasuk alat selesai. Jadi, dua ini akan bersama di pukul. Jadi, untuk beri dua, mereka sebenarnya memberikan alat dua di sini. Jadi, alat ketiga adalah berdua. Kita akan bercakap bahawa saya memasuk alat dan saya memasuk alat. Jadi, alat selesai menjadi satu, alat selesai menjadi dua, alat selesai menjadi tiga. Akhirnya, saya memasuk alat dan alat selesai. adalah ke-6, ke-6 akan ditambah, kita hanya akan mengalami akumulasi sebagai ke-1, jadi setelah itu apabila anda menerima ini, sebenarnya saya tidak perlukan ini, maaf saya tidak perlukan ini, jika saya menerima saya akan menerima satu item di atas, dan menerima itu, jadi saya mempunyai kisah, kisah satu, kisah dua, kisah dan kisah tiga jadi jika saya mahu kisah, yang ialah ini saya katakan 2. So writer mempunyai kisah, kisah satu, kisah dua You can read more about this under writer monad. And you see this, I'm using cats so that I don't have to define all these things. These are very fundamental. There are state monads, writer monad, reader monad. All these things are already defined in cats. And I think in order to use them, you have to understand why you want to use them, why you need them. Then it becomes a lot easier. Because once you understand, then you start writing it, then you find that I need to write a lot of boilerplate. Then that's where cats come in or Scala Z comes in to clear most of the stuff. Or at least whatever in the Scala library, those least options, all these are taken care of. At least they have a type class for all these common functions, common structures. Okey, actually I was kidding the way you do blogging this way. It's actually the better way. This is the better way of course, but this is a lot more difficult for the first time you really want to go to IWON monad. But this is the answer that it's supposed to be. As you can see again, I use a lot of cats. And the logger itself actually depend on cats. So as you go on, then you will find a suite of libraries that cater for functional Scala. But of course, most of the things begin with cats. ZIO now, the latest trend. But on the high level or on the user level it's the same, conceptually they are the same. The usage is about the same, the concept is the same. Alright, we are popular. This one on the style called Techless Final, the way it is written. So you see this, the thing why you want to write this way is almost pure but it's imperative. It's style imperativly but it's a pure function. So, well, then come to the end. So, abstraction allows us to extend our code, like plug-in. Feel like plug-in, you can easily plug-in the place where you want to change the output to be different. And you let cats and cats effect do the heavy lifting and take care of complex stuff like concurrency and parallelism. In this talk it's very simple, because IO mana is very deep and there are a lot of functions. It doesn't even go to a bit of concurrency but when it goes to parallel part there's another library to tick over it. We should also base on IO, we should also base on cats. So, thank you very much. So, any questions? So, did I answer your question? No, okay. So, you use all these things for your work, right? Unfortunately, no. No. It's hard to get people to more Java plus-plus style. Use a lot of filters, use a lot of map and stuff like that, like a fluent API kind of thing. When it comes to this, as far as I concern, zero. What is your motivation for this? What is my? So, it's not like you work in a team that does the Java plus-plus version of Scala. What is your... to maybe help sell cats to the wider audience? What is your motivation for programming? Oh, okay. My motivation is I just want to write code that only when it's right I only want to write once if possible. I mean it's not possible This is what I imagine. So, once the code is right, I keep it there. So, I keep on adding codes to it so that it changes by adding codes, not change by modifying codes. So, because once you have a sizable project, you do a lot of testing already done on it. So, let's say the project had run for two years. The moment you change the code, the thing actually drop back to zero, the reliably drop back to zero because you change something. How can you reliably say that these things will work? Even if you change one variable, how can you say it will work? So, my motivation to do this is there a way to keep adding codes but not changing the original code? I think to some extent if the code base is large enough, even though how good you do it, you still have to tear it down and do it again, but hopefully that's a pretty long time. Okay. So, it defers our side effects at the end of the world. So, instead of performing the side effects immediately when it's called, we defer that and what we call unsaid front. So, the benefit saying like feeding off of what you just said making software more maintainable, you will have to write it once is that now it's more testable. Right? Yes. Because you can test the return type for your function. Yes. Yup. But they but that has nothing to do with the testability has nothing to do with IOM or not, right? It actually it do your function. So, yes, yes. Yes. Yup. You have to write. Yes. Correct. Correct. Yup. Yup. Yup. Yup. Yup. make it up to also give the analog of IOM a自己 aha, ok. Guests, yeah. can go back to the IOM hot slide and you have the guest thing we shall. Yes. So, it's just code correct. you have a pizza in the function guess again you have a yang di dalam makanan. Bagaimana dengan ini? Saya rasa... Anda dapatkan kata-kata. Bukan betul. Kerana saya hanya ingin mencari di atas. Jadi saya mengharapkan kerana saya hanya... di atas kawasan, saya hanya mengharapkan jika saya menerimanya sama seperti apa yang diterimanya. Biasanya... biasanya, tapi... Bukan betul. Baiklah. Baiklah. Baiklah. Baiklah. Ada lagi pertanyaan? Terima kasih banyak.