斯卡拉函数返回类型

问题描述:

我试图改变一个方法到一个函数,但我有跟返回类型的烦恼:斯卡拉函数返回类型

sealed trait CronJobStatus 
case object CronJobSuccess extends CronJobStatus 
case class CronJobFailure(error: Option[String] = None) extends CronJobStatus 

我的方法(工作)是:

def jobNotFoundFailure(name: String): CronJobStatus = CronJobFailure(Some(s"Job with name $name not found")) 

当试图具有jobNotFoundFailure作为一个功能,我无法找到正确的语法来指定,它返回一个CronJobStatus,我有这个功能(但它返回CronJobFailure)

val jobNotFoundFailure = (name: String) => CronJobFailure(Some(s"Job with name $name not found")) 

这意味着我不能在需要CronJobStatus的情况下使用此函数。例如从地图和折叠得到一个选项时:

cronJobsMap.get(name).fold(jobNotFoundFailure(name))(doDelete) 

你可以写

val jobNotFoundFailure: String => CronJobStatus = 
    name => CronJobFailure(Some(s"Job with name $name not found")) 
+0

尝试了超过半个小时寻找语法,但找不到它。谢谢! :) – klogd

另一个可能的选择是:

val jobNotFoundFailure = (name: String) => 
    CronJobFailure(Some(s"Job with name $name not found")): CronJobStatus 

顺便说你的代码(忽略了一个事实,我不知道如何doDelete看起来像)似乎工作,即使jobNotFoundFailure是String => CronJobFailure

cronJobsMap.get(name).fold(jobNotFoundFailure(name))(doDelete) 

每当需要CronJobStatus你可以把CronJobFailure。无论何处需要功能A => CronJobStatusA => CronJobFailure也是有效的,因为Function1[-T, +R]在返回值的类型中是协变的。