以下の内容はhttps://uga-box.hatenablog.com/entry/2024/08/28/000000より取得しました。


【Kotlin】when文の関数型プログラミングへの応用

Kotlinを勉強していて、気になったことのメモ

今回はwhen文の使い方について

最新のJavaではできるようになったこともあるが、ちょっと前の Java を触っていた身からすると、すごく柔軟に感じた

when文

式として使い、戻り値を返すことができる

val x = 2
val result = when (x) {
    1 -> "One"
    2 -> "Two"
    3 -> "Three"
    else -> "Unknown"
}
println(result)  // "Two" と出力

条件式でチェックすることができる

val x = 15
when {
    x % 2 == 0 -> println("x is even")
    x % 2 != 0 -> println("x is odd")
}

is 演算子を使って型をチェックすることができる

fun checkType(obj: Any) {
    when (obj) {
        is String -> println("It's a String: $obj")
        is Int -> println("It's an Integer: $obj")
        is Boolean -> println("It's a Boolean: $obj")
        else -> println("Unknown type")
    }
}

checkType("Hello") // It's a String: Hello
checkType(123)     // It's an Integer: 123
checkType(true)    // It's a Boolean: true

範囲のマッチング

val x = 25
when (x) {
    in 1..10 -> println("x is between 1 and 10")
    in 11..20 -> println("x is between 11 and 20")
    in 21..30 -> println("x is between 21 and 30")
    else -> println("x is outside the range")
}

when 文の中で型チェックを行った後、その変数はスマートキャストされ、明示的なキャストが不要になる

fun smartCastExample(obj: Any) {
    when (obj) {
        is String -> println("String of length ${obj.length}")
        is Int -> println("Square of number is ${obj * obj}")
        else -> println("Unsupported type")
    }
}

smartCastExample("Kotlin")  // String of length 6
smartCastExample(5)         // Square of number is 25

関数型プログラミングへの応用

whenを式として使って、戻り値を返すならば、関数型プログラミングに応用できると思った

そのあたりのざっくりまとめ

  1. 式としての利用:
    • when は値を返す式として機能するので、副作用のない関数(pure function)を簡潔に書ける
  2. パターンマッチング:
    • when は値の種類や条件に基づくパターンマッチングができるので、関数型言語におけるマッチング機構(例えば ScalaHaskell における matchcase)に類似している
  3. 式の合成:
    • when を式として他の関数と組み合わせることで、処理を合成するスタイルを取りやすくなる

例: when を使った関数型プログラミング

1. パターンマッチングによるデータ変換

データクラスやシールクラスのインスタンスに対して、when を使って異なる処理を行う

関数型プログラミングでは、データ型ごとの処理をパターンマッチングで実行することが多く、when はこの目的に適している

sealed class Shape
data class Circle(val radius: Double) : Shape()
data class Rectangle(val width: Double, val height: Double) : Shape()

fun calculateArea(shape: Shape): Double {
    return when (shape) {
        is Circle -> Math.PI * shape.radius * shape.radius
        is Rectangle -> shape.width * shape.height
    }
}

fun main() {
    val circle = Circle(3.0)
    val rectangle = Rectangle(4.0, 5.0)

    println(calculateArea(circle))     // 出力: 28.274333882308138
    println(calculateArea(rectangle))  // 出力: 20.0
}

この例では、when は型に基づいて CircleRectangle の処理を分けている

シールクラス(sealed class)を使うことで、このパターンマッチングがコンパイル時に完全に安全に行うことができる

2. 関数合成のための when

関数型プログラミングでは関数を合成して新しい関数を作ることがよくある

when を用いることで、処理の流れを式としてまとめることができる

fun processInput(input: Int): String {
    return when {
        input < 0 -> "Negative"
        input == 0 -> "Zero"
        input > 0 -> "Positive"
        else -> "Unknown"
    }
}

fun applyTransformation(input: Int): String {
    return processInput(input).uppercase()
}

fun main() {
    println(applyTransformation(-10)) // 出力: "NEGATIVE"
    println(applyTransformation(0))   // 出力: "ZERO"
    println(applyTransformation(42))  // 出力: "POSITIVE"
}

この例では、when で条件分岐を行い、結果をさらに別の関数で変換している




以上の内容はhttps://uga-box.hatenablog.com/entry/2024/08/28/000000より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14