Подтвердить что ты не робот

Существует ли функция идентификации scala?

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

4b9b3361

Ответ 1

В Predef существует функция .

l flatMap identity[Option[String]]

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

А для выражения лучше, я полагаю:

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

Edit:

Я попытался выяснить, почему нужен параметр type (Option [String]). Кажется, что проблема заключается в преобразовании типа из опции [T] в Iterable [T].

Если вы определяете функцию идентификации как:

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

параметр типа может быть опущен.

Ответ 2

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

l.flatMap[String](identity)

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

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

l.flatten[String]

Ответ 3

Вы можете просто дать типу inferencer небольшую помощь:

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)