Kotlin泛型类型推断失败

时间:2018-05-06 15:55:45

标签: kotlin

我正在将一些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 :(得分:1)

S函数的unit类型参数不一定与S中的State类型相同。因此,当您调用unit函数时,需要明确指定它。像这样:

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

编辑: 实际上,类型可以从map的返回类型中得知,但似乎Kotlin中的类型推断并不足以自行解决。