是否可以将高阶函数与可选参数一起使用

财务报告率

我提出了一个虚拟问题来说明我的观点:假设我们具有以下方便的功能来显示有关特定排序算法的信息:

fun sort(name: String, array: Array<Int>, sortingAlgorithm: (Array<Int>) -> Array<Int>) {
    println(name)
    sortingAlgorithm(array).forEach { print(" $it ") }
    println()
}

您可以这样使用它:

sort("Selection Sort - Θ(n^2)", arrayOf(2, 3, 1), ::selectionSort)

这之所以有效是因为的签名selectionSort很简单:fun selectionSort(array: Array<Int>): Array<Int> {

但是说我还有另一个具有以下签名的排序算法

fun quickSort(array: Array<Int>,
              start: Int = 0,
              end: Int = array.size - 1): Array<Int> {

最后两个参数是可选的,因此从理论上讲,您可以quickSort按相同的方式调用selectionSort也就是说,它仍然尊重签名(Array<Int>) -> Array<Int>吗?

不幸的是,当我尝试致电时,sort("Quick Sort", arrayOf(2, 3, 1), ::quickSort)我得到:

类型不匹配

我认为编译器不够聪明,无法意识到这两个参数是可选的。除了使sort方法重载以接受带有签名的高阶函数以外,如何避免这个问题

沃丹

无法避免此问题,因为它会与Kotlin类型系统的2个基石相矛盾:

  • 1)每个表达式都有一个类型(强类型)
  • 2)接收方不会影响表达式的类型(本地推断)

例如,如果您可以这样做,那么以下操作将无效,这是示例的简单重构:

val algorithm = ::quickSort
sort("Quick Sort", arrayOf(2, 3, 1), algorithm)

无论如何,sort("Quick Sort", { quickSort(unsorted) })对于Kotlin开发人员来说解决方法太简单了,无法花费时间在问题上。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

是否可以将std :: sort与需要额外参数的sort函数一起使用?

是否可以将“ zip()”与step参数一起使用?

是否可以将 ggiraph 交互函数与使用 stat_summary 生成的 ggplots 一起使用

是否可以将CallMethodAction交互与参数一起使用?

是否可以将`case object`与类型参数一起使用?

是否可以将参数化的URL模板与angular $ http服务一起使用

是否可以将不带参数并返回void的函数指针类型与带参数并返回值的函数一起使用?

您可以将训练参数与 tf.keras.Model() 构造函数一起使用吗?

是否可以将* =运算符与round()函数一起使用

是否可以将Oracle的用户定义的聚合函数定义为与两列一起使用?

是否可以将预测函数与 r 中的随机森林模型一起使用?

是否可以将typeof与泛型函数一起使用?

是否可以将 Count() 函数与 WHERE 条件一起使用?

Keras-将激活函数与参数一起使用

noglob 函数然后将 ls 与参数一起使用?

是否可以将@XmlHeader与Jackson一起使用?

是否可以将QInputDialog与嵌套列表一起使用?

是否可以将docker与jrebel或dcevm一起使用

是否可以将Singleton与ViewControllers一起使用?

是否可以将GROUP BY与绑定变量一起使用?

是否可以将Feed与延迟列表一起使用?

是否可以将AutoLayout与UITableView的tableHeaderView一起使用?

是否可以将SpringWebflux与休眠一起使用?

我是否可以将JoinableTaskFactory与AspNetCore一起使用?

是否可以将TIOCMBIS与伪终端一起使用?

是否可以将asciidoc与hakyll一起使用?

是否可以将 Oracle 的 sysdate 与 jdbcTemplate 一起使用

是否可以将onTap与FirebaseAnimatedList一起使用

是否可以将IS NOT NULL与GROUP BY子句一起使用?