【问题标题】:Is there a scala identity function?有scala身份功能吗?
【发布时间】:2010-12-20 07:54:28
【问题描述】:

如果我有类似List[Option[A]] 的东西,并且我想将其转换为List[A],标准方法是使用flatMap

scala> val l = List(Some("Hello"), None, Some("World"))
l: List[Option[java.lang.String]] = List(Some(Hello), None, Some(World))

scala> l.flatMap( o => o)
res0: List[java.lang.String] = List(Hello, World)

现在o => o 只是一个身份函数。我原以为会有一些方法可以做:

l.flatMap(Identity) //return a List[String]

但是,由于您无法生成 object,因此我无法使其正常工作。我尝试了几件事无济于事;有没有人有这样的工作?

【问题讨论】:

  • 我认为{_} 应该等同于{x => x},就像{_ + 3} 等同于{x => x+3}。谁能评论为什么不是这样?

标签: scala functional-programming scala-option


【解决方案1】:

有一个身份function in Predef

l flatMap identity[Option[String]]

> List[String] = List(Hello, World)

我想,A 表示更好:

for(x <- l; y <- x) yield y

编辑:

我试图弄清楚为什么需要类型参数 (Option[String])。问题似乎是从 Option[T] 到 Iterable[T] 的类型转换。

如果你定义恒等函数为:

l.flatMap( x => Option.option2Iterable(identity(x)))

类型参数可以省略。

【讨论】:

  • 为什么类型推断器无法判断类型本身?为什么l.flatMap(identity): List[String] 不起作用?
  • 我认为推理者可以解决这个问题。我不知道。我会添加一个问题。 :-)
  • @oxbow_lakes - 见编辑。它与隐式类型转换有关。
  • @Thomas - 谢谢。对身份/选项/可迭代事物感到羞耻,因为这似乎是可能使用它的主要地方之一。不幸的是,与没有身份相比,它的可读性要差
  • 此解决方案似乎不适用于 scala 2.9.1。 l flatMap identity[Option[String]] &lt;console&gt;:9: error: polymorphic expression cannot be instantiated to expected type; found : Option[String] =&gt; Option[String] required: Option[java.lang.String] =&gt; scala.collection.GenTraversableOnce[?] l flatMap identity[Option[String]] ^
【解决方案2】:

FWIW,在 Scala 2.8 上,您只需调用 flatten 即可。 Thomas 主要涵盖 Scala 2.7。他只是错过了使用该身份的另一种方式:

l.flatMap[String](identity)

但是,它不适用于运算符表示法(似乎运算符表示法不接受类型参数,这很高兴知道)。

您可以在 Scala 2.7 上调用 flatten(至少在 List 上),但如果没有类型,它将无法执行任何操作。但是,这是可行的:

l.flatten[String]

【讨论】:

    【解决方案3】:

    你可以给类型推断器一点帮助:

    scala> val l = List(Some("Hello"), None, Some("World"))
    l: List[Option[java.lang.String]] = List(Some(Hello), None, Some(World))
    
    scala> l.flatten[String]
    res0: List[String] = List(Hello, World)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-19
      • 2020-07-19
      • 2018-07-19
      • 2018-12-27
      • 1970-01-01
      相关资源
      最近更新 更多