Scala高阶函数问题
我的目标是:尽量减少代码行数 有一些功能,如Scala高阶函数问题,scala,functional-programming,Scala,Functional Programming,我的目标是:尽量减少代码行数 有一些功能,如f1,f2 f1(A: String) f2(A: String, B: Long, C: User) 我们想用高阶函数的方法来处理它 def processf1(request: Request[AnyContent], f: (String) => String) def processf2(request: Request[AnyContent], f: (String, Long, User) => String) = {..
f1
,f2
f1(A: String)
f2(A: String, B: Long, C: User)
我们想用高阶函数的方法来处理它
def processf1(request: Request[AnyContent], f: (String) => String)
def processf2(request: Request[AnyContent], f: (String, Long, User) => String) = {...}
我是否可以为f1、f2
创建一个通用过程
函数
有什么想法吗
谢谢 您可以参数化
processf
类型:
def processf[S,T](request: Request[S], f: T => String) = ...
使用示例:
processf(new Request[Int], (x: String) => x)
processf(new Request[Int], (x: (String, Long, User)) => x._1)
谢谢你的回答,但我不太清楚,请澄清一下好吗 例如,具有重复项的函数,如
RequestUtil.getRequestParams
private def regUser(request: Request[AnyContent], f: (String) => String): String = {
RequestUtil.getRequestParams(request, APPConst.USER) match {
case Some(map) => f(map(APPConst.USER))
case None => JsonUtil.toJson(APPConst.ERROR -> APPConst.POST_PARAMS_EMPTY_MISMATCH)
}
}
private def regDog(request: Request[AnyContent], f: (Dog, Enum, String, String) => String): String = {
RequestUtil.getRequestParams(request, APPConst.Dog) match {
case Some(m) => process(m, f)
case None => JsonUtil.toJson(APPConst.ERROR -> APPConst.POST_PARAMS_EMPTY_MISMATCH)
}
}
private def regCat[T](request: Request[AnyContent], f: (Cat, Enum) => String): String = {
RequestUtil.getRequestParams(request, APPConst.CAT) match {
case Some(map) => process(map, f)
case None => JsonUtil.toJson(APPConst.ERROR -> APPConst.POST_PARAMS_EMPTY_MISMATCH)
}
}
和处决
def regUser = Action { request => Ok(views.html.index(regUserProcess(request, UserService.regUser)))}
def regDog = Action { request => Ok(views.html.index(regCurrProcess(request, UserService.regDog)))}
def regCat = Action { request => Ok(views.html.index(mainProcess(request, UserService.regCat)))}
正如您在Scala中看到的3个具有不同计数参数的不同函数一样,您可以按类型对函数进行参数化。e、 g:
f(x:Int):String=x.toString
和g(x:Int):x.toString
可以表示为唯一的函数f[T](x:T):=x.toString
。由于Scala的类型推断,您可以将f
称为f(1)
和f(“1”)
。我的回答应用了相同的策略,但适用于您正在传递类型的函数。对于您的方法,它们可以合并为一个类型参数化的单一方法:private def regUser[T,S](request:request[AnyContent],f:T=>String,params:S):String={params match{case Some(x)=>f(x);case None=>JsonUtil.toJson(APPConst.ERROR->APPConst.POST_PARAMS_EMPTY_MISMATCH);}
btw,您不应该回答问题来添加更多信息。您应该编辑原始帖子。