创建 Kotlin 中缀表示法以将一个函数嵌套到另一个函数时,类型不匹配

type mismatch when create a kotlin infix notation to nest a function to another

提问人:Langua 提问时间:9/30/2021 更新时间:9/30/2021 访问量:100

问:

我正在尝试创建一个中缀符号作为函数的扩展函数,用于将一个函数嵌套到另一个函数。
例如:
(Int) -> Int

class Entry {
    companion object {
        private fun f(x: Int) = x * 2
        private fun g(x: Int) = x + 2

        private infix fun ((Int) -> Int).nest(inner: (Int) -> Int) = { x: Int -> this(inner(x)) }

        @JvmStatic
        fun main(args: Array<String>) {
            val func = ::f nest ::g
            println(func(10))
        }
    }
}

这段代码工作正常,它创建了一个中缀表示法作为扩展函数来发挥作用。它需要另一个函数并将它们嵌套在一起。
等于
等于 。
nest(Int) -> Int(Int) -> Intval func = ::f nest ::gval fun func(x:Int) = f(g(x))func(10)(10 + 2) * 2

但是当我尝试将此扩展符号函数扩展到接口(用于支持各种数字)时,我遇到了一个问题。
例如:
Number

class Entry {
    companion object {
        private fun f(x: Int) = x * 2
        private fun g(x: Int) = x + 2

        private infix fun ((Number) -> Number).nest(inner: (Number) -> Number) = { x: Number -> this(inner(x)) }
        // only the infix fun declaration changed ^

        @JvmStatic
        fun main(args: Array<String>) {
            val func = ::f nest ::g
            println(func(10))
        }
    }
}

kotlin 编译器抛出错误。

Kotlin: Unresolved reference. None of the following candidates is applicable because of receiver type mismatch: 
private final infix fun ((Number) -> Number).nest(inner: (Number) -> Number): (Number) -> Number defined in ...(path of class Entry)

我想知道为什么从 延伸,但与 不匹配。
如果我想将此表示法函数扩展到所有请求数字并返回数字的函数(例如等),我应该怎么做?
IntNumber(Int) -> Int(Number) -> Number(Long) -> Long(Float) -> Double

Kotlin 方法 中缀表示法 first-class-functions 扩展函数

评论


答:

1赞 Sweeper 9/30/2021 #1

请注意,a 是一种 .也就是说,你可以把 any 给 a ,但你只能把 s 传递给 a 。(Int) -> Int(Number) -> NumberNumber(Number) -> NumberInt(Int) -> Int

按照你的逻辑,我可以用一个,因为也是一个(按照你的逻辑),但这肯定没有意义,不是吗?您不能将 a 传递给 .nest(Int) -> Int(Double) -> Double(Double) -> Double(Number) -> NumberDouble(Int) -> Int

您的函数可以更通用地使用泛型编写:nest

infix fun <T, U, V> ((U) -> V).nest(inner: (T) -> U) = { x: T -> this(inner(x)) }

可以嵌套任何 ,产生 .(U) -> V(T) -> U(T) -> V