χάρτης μυαλού

training_kotlin

Λειτουργικός προγραμματισμός

Οι ασκήσεις είναι παγμένες από το βιβλίο:
Λειτουργικός προγραμματισμός στην Kotlin με tutorial
Γραμμένο από Massimo Carli
repo: https://github.com/kodecocodes/fpk-materials

Σύνταξη

FirstProgramTest

έννοιες: εμφάνιση οθόνης, λειτουργία
FirstProgramTest:https://github.com/cheroliv/cheroliv.com/blob/master/codes/src/test/kotlin/programming/FirstProgramTest.kt[source]+

ConcatFunctionTest

εννοίες: μνήμη, μεταβλητή, τιμή, αντικείμενο, έκταση συνάρτησης
ExampleUnitTest: πηγή+

Έξοδος δοκιμής μηνύματος γενεθλίας

εννοιες: σέτα, βρόχοι
Εισαγωγή στο Kotlin
BirthdayMessageTestOutput:https://github.com/cheroliv/cheroliv.com/blob/master/codes/src/test/kotlin/programming/BirthdayMessageTestOutput.kt[πηγή]+

Μάθημα kotlin

Οδηγός για τις συλλογές στην Java

η καρδιά των διεπαφών συλλογής
εικόνα:../../img/0036_training_kotlin_post/colls-coreInterfaces.gif[Συλλογές]

Λειτουργικά βασικά

Δηλωτική X προστακτική προσέγγιση

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")
        })
    }
}

�Άσκηση 1.1

Υλοποιήστε τη συνάρτηση sumInRange, η οποία προσθέτει τις τιμές στο
μια List<String> σε ένα δοσμένο διάστημα. Η υπογραφή είναι :

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") }
    )
}

Δοκιμάστε το και ελέγξτε την απάντησή σας με τηνhttps://github.com/cheroliv/cheroliv.com/blob/master/codes/src/test/kotlin/functional/DeclarativeTests.kt[λύση, windows="_blank].

υψηλού βαθμού συναρτήσεις

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() }
}

Άσκηση 1.2

Υλοποιήστε το chrono, που δέχεται μια συνάρτηση τύπου`() →`
Η μονάδα παίρνει ως είσοδο και επιστρέφει τον χρόνο που πέρασε στην εκτέλεσή του. Η υπογραφή είναι:

fun chrono(fn : () -> Unité) : Long
@Test
fun `Exercise 1_2`() {
    val waitOneSec = { sleep(ONE_SECOND) }
    chrono(waitOneSec).apply {
        println("chrono: $this")
        assertEquals(1, sign)
    }
}

Δοκιμάστε το και ελέγξτε την απάντησή σας με τοhttps://github.com/cheroliv/cheroliv.com/blob/master/codes/src/test/kotlin/functional/BasicsHOFTests.kt[λύση, windows="_blank].

Σύνθεση

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))
    }

}

καθαρές συναρτήσεις και δοκιμασιμότητα

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)
        }
    }
}

Διαχείριση εξαιρέσεων

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
        )
    }
}

Κλειδιά σημεία

  • Ως που η αντικειμενοστραφής προγραμματισμός σημαίνει τον προγραμματισμό με αντικείμενα,

Η λειτουργική προγραμματισμός σημαίνει να προγραμματίζετε με συναρτήσεις. Αναλύετε ένα πρόβλημα σε πολλά υποπροβλήματα, που το μοντελοποιείτε με οι λειτουργίες.

  • Οι συναρτήσεις υψηλότερου τάξης δέχονται άλλες συναρτήσεις ως είσοδο ή επιστρέφουν άλλες

λειτουργούν ως τιμές επιστροφής. Η théorie des categories est la théorie de la composition, et vous l’utilisez pour comprendre

Wait need Greek not French. Let’s produce correct Greek:

"Η θεωρία των κατηγοριών είναι η θεωρία της σύνθεσης, και τη χρησιμοποιείτε για να κατανοήσετε". Ensure no extra spaces. Output only that.

</think>

Η théorie des categories est la théorie de la composition, et vous l’utilisez pour comprendre

Oops I mistakenly repeated French. Let’s correct.

Final answer: Greek translation.

</think>

Η θεωρία των κατηγοριών είναι η θεωρία της σύνθεσης, και τη χρησιμοποιείτε για να κατανοήσετε πώς να συνθέσετε τις συναρτήσεις σας σε ένα πρόγραμμα εργασίας. Η τιμή εξόδου μιας καθαρής συνάρτησης δεν εξαρτάται μόνο από τις παραμέτρους εισόδου, και αυτή Δεν έχει παρενέργειες.

  • Ένα παρενέργεια είναι κάτι που μια συνάρτηση κάνει στον εξωτερικό κόσμο. αυτό

μπορεί να είναι ένα αρχείο καταγραφής στην τυπική έξοδο ή η τροποποίηση της τιμής μιας παγκόσμιας μεταβλητής. Η λειτουργική προγραμματισμός λειτουργεί για τις καθαρές συναρτήσεις, αλλά παρέχει επίσης τα εργαλεία για τη μετατροπή ανεπακτικών συναρτήσεων σε καθαρές συναρτήσεις. Μπορείτε να κάνετε μια ακαθάρτη συνάρτηση καθαρή μετατοπίζοντας τα εφέ ώστε να τα κάνετε μέρος της τιμής επιστροφής

  • Ο λειτουργικός προγραμματισμός είναι θέμα σύνθεσης.

Η διαχείριση σφαλμάτων είναι μια τυπική περίπτωση παρενέργειας, και η Kotlin σας δίνει τα εργαλεία για να τα διαχειρίζονται με λειτουργικό τρόπο.

Βαθύτερη μελέτη Java 8: έκφράσεις lambda και λειτουργικές διεπαφές

�Θεωρία των κατηγοριών

Η μαθηματική θεωρία των κατηγοριών:

Βασικά των συναρτήσεων

�Άσκηση 2.1

Μπορείτε να γράψετε ένα παράδειγμα συνάρτησης που αντιστοιχεί διαφορετικές τιμές
ποιος το τομέα έχει μη διακριτές τιμές στο εύρος, όπως f(b) και f(c) στον παρακάτω γράφημα ?

Δοκίμασέ το, στη συνέχεια ελέγξτε το πρότζεκτ του defi για μια λύση ώστε να δείς πώς το έκανες.
�Θα βρείτε συμβουλές και μια εξήγηση ακολουθώντας το σύνδεσμο προς την λύση.

Άσκηση 2.2

Μπορείτε να γράψτε την αντίστροφη συνάρτηση του διπλασιασμού;
Ποια είναι το domain και το εύρος της αντίστροφης συνάρτησης;
Εξετάστε το έργο της πρόκλησης και το Πρόσθετο B για τη λύση.

fun chrono(fn : () -> Unité) : Long
@Test
fun `Exercise 1_2`() {
    val waitOneSec = { sleep(ONE_SECOND) }
    chrono(waitOneSec).apply {
        println("chrono: $this")
        assertEquals(1, sign)
    }
}

Δοκιμάστε το και ελέγξτε την απάντησή σας με τηhttps://github.com/cheroliv/cheroliv.com/blob/master/codes/src/test/kotlin/functional/BasicsHOFTests.kt[λύση, windows="_blank].

Σχετικά άρθρα