Eğitim - Kotlin
Yayınlandı: 12 May 2022
Zihin haritası

İşlevsel programlama
Alıştırma soruları kitabından alınmıştır:
Kotlin’de işlevsel programlama dersleri ile
Massimo Carli tarafından yazıldı
repo: https://github.com/kodecocodes/fpk-materials
sözdizimi
FirstProgramTest
kavramlar: ekran gösterimi, işlev
İlk Program Testi:https://github.com/cheroliv/cheroliv.com/blob/master/codes/src/test/kotlin/programming/FirstProgramTest.kt[kaynak]+
ConcatFunctionTest
notions: bellek, değişken, değer, nesne, fonksiyon uzantısı
(Note: Empty output as there was no provided source text to translate.)(no output - empty)</think>
BirthdayMessageTestOutput
kavramlar: kümeler, döngüler
Kotlin’e Giriş
DoğumGünüMesajıTestÇıktısı:https://github.com/cheroliv/cheroliv.com/blob/master/codes/src/test/kotlin/programming/BirthdayMessageTestOutput.kt[kaynak]+
Kotlin dersi
Fonksiyonel temeller
Deklaratif X imperatif yaklaşım
package functional
import kotlin.test.Test
import kotlin.test.assertEquals
class DeclarativeTests {
val input = listOf(
"123", "abc", "1ds", "987", "abdf", "1d3", "de1", "88", "101"
)
fun imperativeSum(list: List<String>): Int {
var sum = 0
for (item in list) {
try {
sum += item.toInt()
} catch (_: NumberFormatException) {
}
}
return sum
}
@Test
fun `test imperative approach`() {
imperativeSum(input).run {
println("Sum $this")
assertEquals(1299, this)
}
}
fun isValidNumber(s: String) = try {
s.toInt()
true
} catch (_: NumberFormatException) {
false
}
fun declarativeSum(list: List<String>) = list
.filter(::isValidNumber)
.map(String::toInt)
.sum()
@Test
fun `test declarative approach`() {
assertEquals(1299, declarativeSum(input).apply {
println("Sum $this")
})
}
}
Alıştırma 1.1
sumInRange fonksiyonu uygulayın; bu fonksiyon, içinde değerleri toplar.
Verilen bir aralıkta bir List<String>. İmzası şu şekildedir:
fun sumInRange(input: List<String>, range: IntRange): Int
@Test
fun `Exercise 1_1`() {
assertEquals(4, sumInRange(
listOf("1", "10", "a", "7", "ad2", "3"),
1..5
).apply { println("sumInRange 1..5: $this") }
)
}
Deneyin ve cevabınızı ile kontrol edinhttps://github.com/cheroliv/cheroliv.com/blob/master/codes/src/test/kotlin/functional/DeclarativeTests.kt[çözüm, windows="_blank].
Yüksek derecede fonksiyonlar
package functional
import java.io.ByteArrayOutputStream
import java.io.PrintStream
import java.lang.System.*
import java.lang.Thread.sleep
import kotlin.math.sign
import kotlin.test.Test
import kotlin.test.assertEquals
class BasicsHOFTests {
val ONE_SECOND = 1000L
@Test
fun `high order function`() {
//capture de la sortie standard
val standardOut: PrintStream? = out
val outputStreamCaptor = ByteArrayOutputStream()
setOut(PrintStream(outputStreamCaptor))
3.times { println("Hello") }
assertEquals(
buildString {
repeat(3) { append("Hello\n") }
deleteAt(length - 1)
}, outputStreamCaptor
.toString()
.trim()
)
//libération de la sortie standard
setOut(standardOut)
}
fun Int.times1(fn: () -> Unit) {
for (i in 1..this) {
fn()
}
}
fun Int.times2(fn: () -> Unit) {
for (i in 1..this) fn()
}
fun Int.times3(fn: () -> Unit) =
(1..this).forEach { fn() }
fun Int.times4(fn: () -> Unit) =
repeat((1..this).count()) { fn() }
fun Int.times(fn: () -> Unit) =
(1..this).forEach { _ -> fn() }
}
Alıştırma 1.2
Tipi olan bir fonksiyonu kabul eden kronometriyı uygulayın`() →`
Giriş alır ve çalıştırma süresini döndürür. İmzası şu şekildedir:
fun chrono(fn : () -> Unité) : Long
@Test
fun `Exercise 1_2`() {
val waitOneSec = { sleep(ONE_SECOND) }
chrono(waitOneSec).apply {
println("chrono: $this")
assertEquals(1, sign)
}
}
Deneyip cevabını la ile kontrol edinhttps://github.com/cheroliv/cheroliv.com/blob/master/codes/src/test/kotlin/functional/BasicsHOFTests.kt[çözüm, windows="_blank].
Kompozisyon
package functional
import kotlin.test.Test
import kotlin.test.assertEquals
fun double(x: Int): Int = 2 * x
fun square(x: Int): Int = x * x
fun squareAndDouble1(x: Int) = double(square(x))
infix fun <A, B, C> ((A) -> B).compose(g: (B) -> C)
: (A) -> C = { a -> g(this(a)) }
class CompositionTests {
@Test
fun composition_impure() {
assertEquals(200, double(square(10)))
assertEquals(200, squareAndDouble1(10))
}
@Test
fun composition_pure() {
val squareAndDouble = ::square compose ::double
assertEquals(200, squareAndDouble(10))
}
}
saf fonksiyonlar ve test edilebilirlik
package functional
import java.io.ByteArrayOutputStream
import java.io.PrintStream
import java.lang.System.out
import java.lang.System.setOut
import kotlin.test.Test
import kotlin.test.assertEquals
var count = 0
//impure car une variable global subit un effet de bord
fun impure(value: Int): Int {
count++
return value + count
}
//impure car utilisation de la sortie standard qui fait muter le system
fun addOneAndLog(x: Int): Int {
val result = x + 1
println("New Value is $result")
return result
}
//pure
fun addOne(x: Int) = (x + 1).run {
Pair(this, "New Value is $this")
}
class PureTests {
@Test
fun `impure fonction`() {
assertEquals(3, impure(2))
val standardOut = out
val outputStreamCaptor = ByteArrayOutputStream()
setOut(PrintStream(outputStreamCaptor))
addOneAndLog(3)
assertEquals(
"New Value is 4",
outputStreamCaptor
.toString()
.trim()
)
setOut(standardOut)
}
@Test
fun `pure fonction`() {
addOne(3).run {
assertEquals(4, first)
assertEquals("New Value is 4", second)
}
}
}
İstisna işleme
package functional
import org.junit.jupiter.api.assertThrows
import kotlin.Result.Companion.failure
import kotlin.Result.Companion.success
import kotlin.test.Test
import kotlin.test.assertEquals
//NumberFormatException est un effet de bord qui rend la fonction impure
fun strToInt(str: String) = str.toInt()
//pure
fun strToIntOrNull(str: String) = try {
str.toInt()
} catch (nfe: NumberFormatException) {
null
}
//pure avec gestion de l'exception plus élégante
fun strToIntResult(str: String): Result<Int> =
try {
success(str.toInt())
} catch (nfe: NumberFormatException) {
failure(nfe)
}
class ExceptionHandlingTests {
@Test
fun impure() {
assertThrows<NumberFormatException> { strToInt("foo") }
assertEquals(1, strToInt("1"))
}
@Test
fun pure() {
assertEquals(null, strToIntOrNull("foo"))
assertEquals(1, strToIntOrNull("1"))
}
@Test
fun `pure avec result`() {
assertEquals(1, strToIntResult("1").getOrNull())
assertEquals(
"For input string: \"foo\"",
strToIntResult("foo")
.exceptionOrNull()
?.message
)
}
}
Önemli noktalar
-
Nesne yönelimli programlama, nesnelerle programlama yapmak anlamına gelir.
Fonksiyonel programlama fonksiyonlarla programlamayı ifade eder. Siz bir sorunu birkaç alt-soruna bölersiniz, bunları … ile modellersiniz. fonksiyonlar.
-
Yüksek dereceden fonksiyonlar diğer fonksiyonları girdi olarak kabul eder veya diğerlerini döndürür.
geri dönüş değeri gibi çalışır Kategori teorisi kompozisyon teorisidir, ve onu anlamak için kullanırsın. İş planınızda işlevlerinizi nasıl oluşturabilirsiniz? Bir fonksiyonunun çıkış değeri, sadece giriş parametrelerine bağlıdır ve o Yan etkisi yok.
-
Bir yan etki, bir fonksiyonun dış dünyada yaptığı şeydir. Bu
Standart çıktıda bir günlük oluşturulabilir ya da bir genel değişkenin değeri değiştirilebilir. Fonksiyonel programlama temiz fonksiyonlar için işe yarar, ancak aynı zamanda da sağlar İmpür fonksiyonları pure fonksiyonlara dönüştürmek için araçlar Bir fonksiyonun etkilerini taşıyarak onu temiz (pure) hale getirebilirsiniz. geri dönüş değerinin kısmı
-
Fonksiyonel programlama bir kompozisyon meselesidir.
Hata yönetimi, yan etkilerin tipik bir örneğidir ve Kotlin size araçlar verir. fonksiyonel bir şekilde yönetmek için
java8’i derinleştirmek: lambda ifadeleri ve fonksiyonel arayüzler
Kategori kuramı
Matematiksel kategori teorisi:
Fonksiyonların temelleri
Alıştırma 2.1
Farklı değerleri eşleyen bir fonksiyonun örneği yazabilir misiniz?
ki domaini, aralıkta tekrarlanan değerler alır, f(b) ve f(c) gibi, aşağıdaki şekilde ?
Deneyin, ardından bir çözüm görmek için challenge projesine bakıp, nasıl yaptığınızı görün.
Bağlantıyı izleyerek tavsiyeler ve bir açıklama bulacaksınız çözüm(empty)
Alıştırma 2.2
İki katı fonksiyonunun tersini yazabilir misin ?
Ters fonksiyonun tanım alanı ve değeri alanı nedir?
Defa projesini ve Ek B’yi çözüm için inceleyin.
fun chrono(fn : () -> Unité) : Long
@Test
fun `Exercise 1_2`() {
val waitOneSec = { sleep(ONE_SECOND) }
chrono(waitOneSec).apply {
println("chrono: $this")
assertEquals(1, sign)
}
}
Deneyin ve cevabınızı kontrol edinhttps://github.com/cheroliv/cheroliv.com/blob/master/codes/src/test/kotlin/functional/BasicsHOFTests.kt[çözüm, windows="_blank].
