প্রশিক্ষণ - Kotlin
Publié le 12 May 2022
মানসিক নকশা

ফাংশনাল প্রোগ্রামিং
এই execrices বই থেকে নেওয়া হয়েছে:
টিউটোরিয়ালের মাধ্যমে কোটলিনে ফাংশনাল প্রোগ্রামিং
Massimo Carli tarafından লেখিত
রিপো: https://github.com/kodecocodes/fpk-materials
সিনট্যাক্স
FirstProgramTest
অবধারনা: স্ক্রীন ডিসপ্লে, ফাংশন
FirstProgramTesthttps://github.com/cheroliv/cheroliv.com/blob/master/codes/src/test/kotlin/programming/FirstProgramTest.kt[উৎস]+
ConcatFunctionTest
ধারণা: স্মৃতি, ব্যারিয়েবল, মান, অবজেক্ট, ফাংশন এক্সটেনশন
(Empty)উৎস+
BirthdayMessageTestOutput
ধারণা: সেট, লুপ
কটলินের ভূমিকা
BirthdayMessageTestOutput:https://github.com/cheroliv/cheroliv.com/blob/master/codes/src/test/kotlin/programming/BirthdayMessageTestOutput.kt[উৎস]+
কোটলিন কোর্স
কার্যকর মৌলিক
ঘোষণামূলক 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")
})
}
}
অ্যাসাইনমেন্ট ১.১
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
ক্রোনো বাস্তবায়ন করুন, যা একটি ফাংশন গ্রহণ করে যেকোনো প্রকারের`() →`
ইনপুটে ইউনিট এবং এর চালানোর সময় ফেরত দেয়। সাইনেচার :
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
)
}
}
মुख্য বিন্দু
-
অবজেক্ট-উকুচিত প্রোগ্রামিং মানে অবজেক্টগুলো ব্যবহার করে প্রোগ্রামিং করা,
ফাংশনাল প্রোগ্রামিং মানে ফাংশন দিয়ে প্রোগ্রাম করা। আপনি একটি সমস্যাকে একাধিক উপসমস্যায় ভাগ করেন, যা আপনি দিয়ে মডেল করেন। ফাংশনগুলো।
-
উচ্চমাত্রিক ফাংশনগুলো অন্যান্য ফাংশনকে ইনপুট হিসেবে গ্রহণ করে বা অন্যান্য ফাংশন প্রদান করে
ফেরত মান হিসেবে কাজ বস্তুসিদ্ধান্তের তত্ত্ব হল গঠনের তত্ত্ব, এবং আপনি এটি বোঝার জন্য ব্যবহার করেন কীভাবে আপনার ফাংশনগুলোকে একটি কর্মসূচিে গঠন করবেন একটি পরিষ্কার ফাংশনের আউটপুট মান শুধুমাত্র এর ইনপুট প্যারামিটারগুলো দ্বারা নির্ভর করা হয়, এবং এটা কোনো পার্শ্বপ্রভাব নেই।
-
একটি পার্শ্বপ্রভাব হলো যে কোনো ফাংশন বাহ্যিক পৃথিবীকে যা করে। এই
এটি স্ট্যান্ডার্ড আউটপুটে একটি লগ অথবা কোনো গ্লোবাল ভ্যারিয়েবলের মান পরিবর্তন হতে পারে। ফাংশনাল প্রোগ্রামিং শুদ্ধ ফাংশনের জন্য কাজ করে, কিন্তু এটি আরও সরবরাহ করে উপকরণগুলো অশুদ্ধ ফাংশনগুলোকে শুদ্ধ ফাংশনে পরিণত করতে। আপনি একটি অসুৎস ফাংশনকে শুৎস ফাংশনে পরিণত করতে পারেন, তার ইফেক্টগুলোকে স্থানান্তরিত করে, তাদেরকেও শুৎস করতে। ফেরত মানের অংশ।
-
ফাংশনাল প্রোগ্রামিং কম্পোজিশনের বিষয়।
ত্রুটি ব্যবস্থাপনা পার্শ্বপ্রभावের একটি সাধারণ ক্ষেত্র, এবং কোটলিন আপনাকে সরঞ্জাম দেয় এগুলোকে কার্যকরভাবে পরিচালনা করতে।
জাভা ৮ গভীরভাবে আলোচনা: ল্যাম্বডা এক্সপ্রেশন এবং ফাংশনাল ইন্টারফেস
বিভাগ তত্ত্ব
ব্র্যাকেটের গাণিতিক তত্ত্ব:
ফাংশনের মৌলিক
অ্যাসাইনমেন্ট 2.1
আপনি কি একটি ভিন্ন মানগুলোকে মানচিত্রণকারী ফাংশনের উদাহরণ লিখতে পারেন?
যের ডোমেইন রেঞ্জে অস্বতন্ত্র মান আছে, যেমন f(b) এবং f(c) নিম্নোক্ত চিত্রে ?
এটা চেষ্টা কর, তারপর চ্যালেঞ্জ প্রকল্পটি পরীক্ষা কর একটি সমাধানের জন্য যাতে দেখে কিভাবে তুমি
আপনি লিঙ্ক অনুসরণ করে পরামর্শ ও ব্যাখ্যা খুঁজে পাবেন সমাধান.
অ্যাসাইনমেন্ট ২.২
তুই দোগুন ফাংশনের উলটো ফাংশন লিখতে পারো ?
প্রতিলোম ফাংশনের ডোমেইন এবং রেঞ্জ কী?
চ্যালেঞ্জ প্রজেক্ট এবং অ্যাপেনডিক্স 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[solution, windows="_blank]।
