valor una tutorial suma reservadas rango puramente programación programacion primer paradigma palabras orden operaciones monadas monad lineal just identidad funciones funcional funcion estilos elementos ejercicios ejemplos dominio derivada declaracion curso constante absoluto scala functional-programming scala-option

una - scala pl



¿Hay una función de identidad scala? (3)

Si tengo algo así como una List[Option[A]] y quiero convertir esto en una List[A] , la forma estándar es usar 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)

Ahora o => o es solo una función de identidad. Hubiera pensado que habría alguna forma de hacerlo:

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

Sin embargo, no puedo hacer que esto funcione ya que no se puede generar un object . Intenté algunas cosas sin resultado; alguien ha conseguido algo como esto para trabajar?


FWIW, en Scala 2.8 simplemente llama flatten sobre él. tiene principalmente cubierto para Scala 2.7. Solo olvidó una forma alternativa de usar esa identidad:

l.flatMap[String](identity)

Sin embargo, no funcionará con la notación del operador (parece que la notación del operador no acepta parámetros de tipo, lo que es bueno saber).

También puede llamar a flatten en Scala 2.7 (en una List , al menos), pero no podrá hacer nada sin un tipo. Sin embargo, esto funciona:

l.flatten[String]


Hay una función de identidad en Predef .

l flatMap identity[Option[String]] > List[String] = List(Hello, World)

A por expresión es más agradable, supongo:

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

Editar:

Traté de averiguar por qué es necesario el parámetro tipo (Opción [String]). El problema parece ser la conversión de tipo de la opción [T] a Iterable [T].

Si define la función de identidad como:

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

el parámetro de tipo puede ser omitido.


Podrías darle un poco de ayuda al tipo 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)