Добавление оператора монадического связывания Haskell в Scala

В Haskell вы можете использовать оператор связывания ( >> = ) следующим образом :

repli :: [a] -> [a]
repli xs = xs >>= \x -> [x,x]

*Main> repli [1,2,3]
[1,1,2,2,3,3]

Я читал, что flatMap является оператором связывания 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)

В качестве педагогического упражнения я пытаюсь добавить поддержку >> = в 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)

Это работает отлично, но только для списков. Я действительно хочу поддерживать любой класс с помощью метода flatMap . Как лучше всего это сделать?

12
задан dbyrne 25 March 2011 в 17:47
поделиться