【发布时间】:2018-08-24 05:54:44
【问题描述】:
目前我正在使用一个名为 arrow 的库中的 compose,它以这种方式定义。
inline infix fun <IP, R, P1> ((IP) -> R).compose(crossinline f: (P1) -> IP): (P1) -> R = { p1: P1 -> this(f(p1)) }
我想做的是从一个列表中组合函数,所以我假设这样简单的事情会起作用。
val add5 = { i: Int -> Option(i + 5) }
val multiplyBy2 = { i: Int -> i * 2 }
fun isOdd(x: Option<Int>) = x.map { y -> y % 2 != 0 }
val composed = listOf(::isOdd, add5, multiplyBy2).reduce { a, b -> a compose b }
但我收到类型错误:
类型推断失败:无法推断内联中缀中的类型参数 IP fun ((IP) -> R).compose(crossinline f: (P1) -> IP): (P1) -> R 没有以下替换接收器:(任何)-> 任何参数:((无)-> 任何)接收器:(无)-> 任何参数: ((Nothing) -> Nothing) 可以应用于接收器:Function1 参数:(Function1)
所以我试试:
val composed = listOf<(Any) -> Any>(::isOdd, add5, multiplyBy2).reduce { x, y -> x compose y }
我明白了:
类型不匹配:推断类型是 KFunction1 但 (Any) -> Any 是预期的
类型不匹配:推断类型是 (Int) -> Option 但 (Any) -> Any 是预期的
类型不匹配:推断类型是 (Int) -> Int 但 (Any) -> Any 是预期的
任何帮助表示赞赏。我不介意我最终是否必须编写自己的 compose 版本。我只需要能够编写函数列表。
编辑:
这没问题:
val composed = ::isOdd compose add5 compose multiplyBy2
如果我有一个函数列表而不是这样写,我只是想达到相同的结果。
【问题讨论】:
标签: kotlin functional-programming arrow-kt