我不知道如何在线搜索<-
或该符号称为什么。
我上课
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
。
答案 0 :(得分:2)
您至少需要实现map
以及可能的flatMap
和filter
,因为它周围的语法糖见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)