Scala:对操作链的理解
Scala: for-comprehension for chain of operations
我的任务是转换以下代码块:
val instance = instanceFactory.create
val result = instance.ackForResult
求理解表达式。
至于理解依赖于元素的枚举,我试图用包装器绕过它 class:
case class InstanceFactoryWrapper(value:InstanceFactory) {
def map(f: InstanceFactory => Instance): Instance
= value.create()
}
其中 map-method 必须只处理一个元素和 return 单个结果:Instance
我用这个表达式测试了这个方法:
for {
mediationApi <- InstanceFactoryWrapper(instanceFactoryWrapper)
}
但是不行:IDEA建议我在这部分使用foreach。但是“foreach”没有 return 任何东西,与 map 相对。
我做错了什么?
简单地说,在使用 List\Option\Either 或其他语言类型时,理解对于将嵌套的 map\flatMap\withFilter 转换为序列很有用。
在理解中使用自定义 classes
但是您自己的 class 或其他第 3 方的呢?
您需要实现单子运算才能在 for-comprehensions 中使用它们。
最低限度:map 和 flatMap。
以自定义配置为例class:
case class Config[T](content: T) {
def flatMap[S](f: T => Config[S]): Config[S] =
f(content)
def map[S](f: T => S): Config[S] =
this.copy(content = f(content))
}
for {
first <- Config("..")
_ = println("Going through a test")
second <- Config(first + "..")
third <- Config(second + "..")
} yield third
这就是您启用理解的方式。
我的任务是转换以下代码块:
val instance = instanceFactory.create
val result = instance.ackForResult
求理解表达式。
至于理解依赖于元素的枚举,我试图用包装器绕过它 class:
case class InstanceFactoryWrapper(value:InstanceFactory) {
def map(f: InstanceFactory => Instance): Instance
= value.create()
}
其中 map-method 必须只处理一个元素和 return 单个结果:Instance
我用这个表达式测试了这个方法:
for {
mediationApi <- InstanceFactoryWrapper(instanceFactoryWrapper)
}
但是不行:IDEA建议我在这部分使用foreach。但是“foreach”没有 return 任何东西,与 map 相对。
我做错了什么?
简单地说,在使用 List\Option\Either 或其他语言类型时,理解对于将嵌套的 map\flatMap\withFilter 转换为序列很有用。
在理解中使用自定义 classes
但是您自己的 class 或其他第 3 方的呢?
您需要实现单子运算才能在 for-comprehensions 中使用它们。
最低限度:map 和 flatMap。
以自定义配置为例class:
case class Config[T](content: T) {
def flatMap[S](f: T => Config[S]): Config[S] =
f(content)
def map[S](f: T => S): Config[S] =
this.copy(content = f(content))
}
for {
first <- Config("..")
_ = println("Going through a test")
second <- Config(first + "..")
third <- Config(second + "..")
} yield third
这就是您启用理解的方式。