scala 有恒等函数吗?

发布于 2024-08-12 08:44:10 字数 544 浏览 10 评论 0原文

如果我有类似 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]

但是,我无法让它工作,因为你无法生成对象。我尝试了一些方法但没有成功;有人有这样的工作吗?

If I have something like a List[Option[A]] and I want to convert this into a List[A], the standard way is to use 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)

Now o => o is just an identity function. I would have thought there'd be some way to do:

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

However, I can't get this to work as you can't generify an object. I tried a few things to no avail; has anyone got something like this to work?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

白鸥掠海 2024-08-19 08:44:10

Predef 中有一个身份函数

l flatMap identity[Option[String]]

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

我认为 for 表达式更好:

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

编辑:

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

如果将恒等函数定义为:

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

类型参数可以省略。

There's an identity function in Predef.

l flatMap identity[Option[String]]

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

A for expresion is nicer, I suppose:

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

Edit:

I tried to figure out why the the type parameter (Option[String]) is needed. The problem seems to be the type conversion from Option[T] to Iterable[T].

If you define the identity function as:

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

the type parameter can be omitted.

捎一片雪花 2024-08-19 08:44:10

FWIW,在 Scala 2.8 上,您只需调用 flatten 即可。 Thomas 大部分内容都涵盖了 Scala 2.7。他只错过了使用该标识的一种替代方法:

l.flatMap[String](identity)

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

您还可以在 Scala 2.7 上调用 flatten(至少在 List 上),但如果没有类型。然而,这有效:

l.flatten[String]

FWIW, on Scala 2.8 you just call flatten on it. Thomas has it mostly covered for Scala 2.7. He only missed one alternative way of using that identity:

l.flatMap[String](identity)

It won't work with operator notation, however (it seems operator notation does not accept type parameters, which is good to know).

You can also call flatten on Scala 2.7 (on a List, at least), but it won't be able to do anything without a type. However, this works:

l.flatten[String]
往事随风而去 2024-08-19 08:44:10

您可以为类型推断器提供一些帮助:

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)

You could just give the type inferencer a little help:

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)
命比纸薄 2024-08-19 08:44:10

斯卡拉3:

List(1,2,3).map(identity)

// val res0: List[Int] = List(1, 2, 3)

Scala 3:

List(1,2,3).map(identity)

// val res0: List[Int] = List(1, 2, 3)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文