Zihin haritası

training_kotlin

İş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

Java koleksiyonları eğitimi

Koleksiyon arayüzlerinin kalbi
Koleksiyonlar

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].

İlgili Makaleler