En Haskell, puede utilizar el operador bind (>>=
) así:Adición de enlace operador monádico de Haskell a Scala
repli :: [a] -> [a]
repli xs = xs >>= \x -> [x,x]
*Main> repli [1,2,3]
[1,1,2,2,3,3]
He leído que flatMap
es el operador se unen de Scala:
def repli [A](xs: List[A]): List[A] =
xs.flatMap { x => List(x,x) }
scala> repli (List(1,2,3))
res0: List[Int] = List(1, 1, 2, 2, 3, 3)
Como ejercicio pedagógico, estoy tratando de agregar soporte para >>=
a Scala:
class MyList[T](list: List[T]) {
def >>= [U](f: T => List[U]): List[U] = list.flatMap(f)
}
implicit def list2mylist[T](list: List[T]) = new MyList(list)
def repliNew [A](xs: List[A]): List[A] =
xs >>= { x: A => List(x,x) }
scala> repliNew (List(1,2,3))
res1: List[Int] = List(1, 1, 2, 2, 3, 3)
Esto funciona perfectamente, pero solo para listas. Realmente quiero apoyar cualquier clase con un método flatMap
. ¿Cuál es la mejor manera de hacerlo?
(¿Algo relevante en [scalaz] (http://code.google.com/p/scalaz/)?) –
Si solo está de acuerdo con los miembros de la jerarquía de colecciones, p. Ej. no 'Opción' sin trabajo adicional - entonces puede usar el método que se muestra en http://stackoverflow.com/questions/5410846 –
+1 para enseñarme una nueva palabra: pedagógico – Bradford