gpt4 book ai didi

kotlin - 高阶函数组合符号

转载 作者:行者123 更新时间:2023-12-02 13:36:17 24 4
gpt4 key购买 nike

我正在使用这个高阶 compose 函数:

fun <T, U, V> higherCompose(): ((U) -> V) -> ((T) -> U) -> (T) -> V =
{ f ->
{ g ->
{ x -> f(g(x)) }
}
}

和应用程序:
 val cos = higherCompose<Double, Double, Double>()()
{ x: Double -> Math.sin(x)}() { x : Double -> Math.PI/2 - x }

我确实理解我们在数学上试图在这里实现的目标。但我正在努力解决的是符号和编程含义:

究竟是什么
higherCompose<Double>()

以及为什么我们对它应用如此奇怪的值:
1. () () 
2. { function1} { function 1}

最佳答案

以下是该符号的解析方式以及函数调用的内容:

higherCompose<Double, Double, Double>()() { x -> Math.sin(x) }() { x -> Math.PI/2  - x }
| ^| ^ ^^^^^^^^^^^^^^^^^^^| ^ ^^^^^^^^^^^^^^^^^^^^^^|
| 1| 2 3 | 4 5 |
|_____________________________________|______________________|_________________________|
| first call | second call | third call |
  • 这是对 higherCompose 的初始无参数调用。返回的值正好是 higherCompose的返回类型,((U) -> V) -> ((T) -> U) -> (T) -> V , 三个类型参数替换为 Double .
  • 这些括号仅用于解决解析歧义。 Kotlin 允许以任何一种形式调用带有 lambda 的函数:f({ }) , f() { } , f { } .如果删除括号,标记为 (3) 的 lambda 将被视为第一次调用的参数。解决这种歧义的一种方法是添加 ()告诉编译器调用的是 (1) 的返回值,而不是 higherCompose
  • 因此,这个 lambda 作为 ((U) -> V) 传递。 higherCompose 的参数的结果类型,产生 ((T) -> U) -> (T) -> V .
  • 添加这些括号是因为 Kotlin 不允许直接使用另一个 lambda 调用带有括号外的 lambda (f() { }) 的调用的返回值:f() { } { }被禁止,但是在 lambda 之间添加另一对括号可以解决这个问题:f() { }() { }表示调用 f的结果与 lambda。
  • 此 lambda 作为 ((T) -> U) 传递(3) 的结果类型的参数,此调用的结果是 (T) -> V

  • 如果你在括号内传递所有的 lambda,你可以获得这个表达式的一个不那么神秘的版本( f({ }) 形式而不是 f() { }f { } ):
    higherCompose<Double, Double, Double>()({ x -> Math.sin(x) })({ x -> Math.PI / 2 - x })

    见: Lambda Expressions and Anonymous Functions在语言引用中。

    关于kotlin - 高阶函数组合符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56332356/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com