创建 kotlin 中缀符号以将函数嵌套到另一个函数时类型不匹配

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

我正在尝试创建一个中缀表示法作为 (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) -> Int 函数并将它们嵌套在一起。
val func = ::f nest ::g 等于 val 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)

我想知道为什么 Int 扩展自 Number,但 (Int) -> Int(Number) -> Number 不匹配。
如果我想把这个记法函数扩展到所有求一个数和returns一个数的函数(比如(Long) -> Long(Float) -> Double等),怎么办?

请注意 (Int) -> Int 而不是 的一种 (Number) -> Number。即,您可以将任何 Number 传递给 (Number) -> Number,但您只能将 Int 传递给 (Int) -> Int.

按照你的逻辑,我可以 nest 一个 (Int) -> Int 和一个 (Double) -> Double,因为 (Double) -> Double 也是一个 (Number) -> Number(由你逻辑),但这肯定没有意义,是吗?您不能将 Double 传递给 (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.