Вопрос

Если у меня есть что-то вроде 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.Я попробовал несколько вещей, но безрезультатно;у кого-нибудь есть что-то подобное, чтобы работать?

Это было полезно?

Решение

Есть личность функция в 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)))

параметр типа можно опустить.

Другие советы

Кстати, на Scala 2.8 вы просто звоните flatten в теме. Томас в основном это касается Scala 2.7.Он пропустил только один альтернативный способ использования этой идентичности:

l.flatMap[String](identity)

Однако он не будет работать с операторной нотацией (похоже, что операторная нотация не принимает параметры типа, и это полезно знать).

Ты можешь также вызов flatten на Scala 2.7 (на List, по крайней мере), но без типа он ничего сделать не сможет.Однако это работает:

l.flatten[String]

Вы могли бы просто немного помочь устройству вывода типа:

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)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top