Не удалось определить общий тип Kotlin - PullRequest
0 голосов
/ 06 мая 2018

Я перевожу некоторый код Scala на Kotlin. Это основано на коде в книге Функциональное программирование в Scala . Вот прямой перевод кода на Kotlin:

data class State<S, out A>(val run: (S) -> Pair<A, S>) {
    fun <B> flatMap(f: (A) -> State<S, B>): State<S, B> = State { s ->
        val (a, s1) = run(s)
        f(a).run(s1)
    }

    fun <B> map(f: (A) -> B): State<S, B> =
            flatMap { a -> unit(f(a)) }

    companion object {
        fun <S, A> unit(a: A): State<S, A> =
                State { s -> a to s }
    }
}

Вызов юнита (f (a)) в карте вызывает следующую ошибку:

Error:(8, 28) Kotlin: Type inference failed: Not enough information to infer parameter S in 
    fun <S, A> unit(a: A): State<S, A>
Please specify it explicitly.

Поскольку все типы являются универсальными, и он знает, что это универсальный тип S, я понятия не имею, какой тип указать. Что не так с этим кодом?

Заранее спасибо.

1 Ответ

0 голосов
/ 06 мая 2018

Параметр типа S, заданный для функции unit, не обязательно совпадает с типом S в State. Поэтому вам нужно указать это явно при вызове функции unit. Как это:

fun <B> map(f: (A) -> B): State<S, B> =
        flatMap { a -> unit<S, B>(f(a)) }

Edit: На самом деле, тип может быть известен из возвращаемого типа map, но кажется, что вывод типа в Kotlin не достаточно силен, чтобы разобраться сам по себе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...