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,您不应该回答问题来添加更多信息。您应该编辑原始帖子。