我正在将一些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,我不知道要指定什么类型。这段代码有什么问题?
提前谢谢。
答案 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中的类型推断并不足以自行解决。