Kotlin 有恒等函数吗?
Does Kotlin have an identity function?
Scala 在 Predef 中有一个通用的 identity
函数:
def identity[A](x: A): A
Kotlin 在标准库中有类似的功能吗?当然我可以简单地使用 { it }
代替,但我发现 identity
更容易阅读,并且实例化所有这些 lambda 有点浪费。
对于任何类型 Foo
,我必须能够在需要函数 (Foo) -> Foo
的地方使用此 identity
函数。在 Kotlin 的类型系统中甚至可以实现这样的功能吗? (在 Scala 的情况下,有一个隐式转换将方法包装在函数对象或其他东西中。)
暂时没有这样的功能,但是你可以很容易地自己定义:
fun <T> identity(x: T): T = x
如果您认为在 Kotlin 标准库中声明此函数有足够的用例,请在 youtrack.jetbrains.com 提交问题。谢谢!
如果需要将恒等函数作为参数传递给另一个函数,可以简单地使用{ it }
。例如,如果您有一个 List> 并想将其展平为 List,您可以使用:
list.flatMap(identity)
其中 identity
是身份函数。这可以写成:
list.flatMap { it }
这相当于:
list.flatMap { x -> x }
另一种方法是在某处定义身份函数,例如:
val identity: (List<String>) -> List<String> = { it }
但我们无法创建泛型 val
,因此我们必须为每种类型定义一个恒等函数。解决方案(正如在 Java Function
接口中所做的那样)是将其定义为常量函数:
fun <A> identity(): (A) -> A = { it }
并将其用作:
list.flatMap(identity)
当然这样写就容易多了:
list.flatMap { it }
一次性声明一个恒等函数(适用于所有类型)是不可能的,因为它必须被参数化。可能的是使用返回此身份函数的函数:
fun <T> identity(): (T) -> T = { it }
虽然它完成了工作,但它不是很有帮助,因为现在必须写:
list.flatMap(identity())
Scala 在 Predef 中有一个通用的 identity
函数:
def identity[A](x: A): A
Kotlin 在标准库中有类似的功能吗?当然我可以简单地使用 { it }
代替,但我发现 identity
更容易阅读,并且实例化所有这些 lambda 有点浪费。
对于任何类型 Foo
,我必须能够在需要函数 (Foo) -> Foo
的地方使用此 identity
函数。在 Kotlin 的类型系统中甚至可以实现这样的功能吗? (在 Scala 的情况下,有一个隐式转换将方法包装在函数对象或其他东西中。)
暂时没有这样的功能,但是你可以很容易地自己定义:
fun <T> identity(x: T): T = x
如果您认为在 Kotlin 标准库中声明此函数有足够的用例,请在 youtrack.jetbrains.com 提交问题。谢谢!
如果需要将恒等函数作为参数传递给另一个函数,可以简单地使用{ it }
。例如,如果您有一个 List> 并想将其展平为 List
list.flatMap(identity)
其中 identity
是身份函数。这可以写成:
list.flatMap { it }
这相当于:
list.flatMap { x -> x }
另一种方法是在某处定义身份函数,例如:
val identity: (List<String>) -> List<String> = { it }
但我们无法创建泛型 val
,因此我们必须为每种类型定义一个恒等函数。解决方案(正如在 Java Function
接口中所做的那样)是将其定义为常量函数:
fun <A> identity(): (A) -> A = { it }
并将其用作:
list.flatMap(identity)
当然这样写就容易多了:
list.flatMap { it }
一次性声明一个恒等函数(适用于所有类型)是不可能的,因为它必须被参数化。可能的是使用返回此身份函数的函数:
fun <T> identity(): (T) -> T = { it }
虽然它完成了工作,但它不是很有帮助,因为现在必须写:
list.flatMap(identity())