如何使自定义类可用于“ <-”?

时间:2018-12-17 03:57:00

标签: scala

我不知道如何在线搜索<-或该符号称为什么。

我上课

class MyClass(collection: List[A]) {}

我希望能够做到:

val bar = new MyClass(???)
for {
  foo <- bar
} yield ???

并遍历collection的元素。

override我需要什么?

我已经看到How to make your own for-comprehension compliant scala monad?了,但是我不知道如何使它产生collection

编辑: 感谢以下所有答案,我得以取得一些进步。

通过实施:

def map(f: A => A): MyClass

def flatMap(f: A => MyClass): MyClass

在理解中使用它没有问题。

但是,从第一个用例开始,foo的类型是Any,而不是A

2 个答案:

答案 0 :(得分:2)

您至少需要实现map以及可能的flatMapfilter,因为它周围的语法糖见the documentation

类似

   class MyClass[A](collection: List[A]){
      def map[B](f: A => B):List[B] = collection.map(f)
    }

答案 1 :(得分:2)

对于单个生成器<-,您的类需要一个map()方法。

class MyClass {
  def map(f :Int => Int) :Int = 42
}
val bar = new MyClass
for {
  foo <- bar
} yield foo  //42

使用第二个生成器时,它还需要一种flatMap()方法。

class MyClass {
  def map(f :MyClass => MyClass) :MyClass = new MyClass
  def flatMap(f :MyClass => MyClass) :Int = 3
}
val bar = new MyClass
for {
  foo <- bar  //map from MyClass to MyClass
  baz <- foo  //flatMap from MyClass to Int
} yield baz   //3

这些当然是伪造的,毫无意义的实现,仅用于演示该概念。

编辑

关于您的评论:

class HiddenCollection[A](mything :List[A]) {
  def map[B](f :A => B) :List[B] = mything.map(f)
}
for {
  x <- new HiddenCollection(List('c', 'y', 'q'))
} yield x.toUpper  //res0: List[Char] = List(C, Y, Q)