тип возврата Either.fold () в библиотеке Kotlin arrow - PullRequest
1 голос
/ 24 апреля 2020

Я изучаю функциональное программирование в Kotlin, используя библиотеку стрелок, и я сталкиваюсь со странным поведением функции сгиба любого типа (по крайней мере, для меня).

import arrow.core.*
import arrow.syntax.function.pipe

object UserService {
    fun findAge(user: String): Either<String, Option<Int>> {
       return Either.Right(Some(1))
    }
}

fun main(args: Array<String>) {
    val anakinAge: Either<String, Option<Int>> = UserService.findAge("Anakin")
    anakinAge.fold({itLeft -> itLeft.toUpperCase()},{itRight -> itRight.fold({ 1 }, {it})}) pipe ::println
}

согласно сгибанию стрелки Синтаксис функции:

inline fun <C> fold(ifLeft: (A) -> C, ifRight: (B) -> C): C

, если значение Left, оно выполняет ifLeft функция и возвращает тип C, если оно верно, оно выполняется ifRight и возвращает значение с тем же типом C, но в приведенном выше фрагменте кода я возвращаю String, если значение Left, и Int, если значение Right. Как он принимает этот синтаксис?

1 Ответ

3 голосов
/ 24 апреля 2020

Здесь fold находит первого общего родителя типов String и Int, который равен Any. В Kotlin, в отличие от Java, нет базовых c типов, это все объекты.

Итак, если вы используете результат для любой функции, которая не принимает Any, она завершится неудачно .

fun check(s: String): String = s

van a = anakinAge.fold({itLeft -> itLeft.toUpperCase()},{itRight -> itRight.fold({ 1 }, {it})})
check(a)

выход Type mismatch: inferred type is Any but String was expected.

...