scala:在函数(val)和使用方法(def)中定义默认参数

scala:在函数(val)和使用方法(def)中定义默认参数,scala,functional-programming,Scala,Functional Programming,我有以下方法: scala> def method_with_default(x: String = "default") = {x + "!"} method_with_default: (x: String)java.lang.String scala> method_with_default() res5: java.lang.String = default! scala> method_with_default("value") res6: java.lang.S

我有以下方法:

scala> def method_with_default(x: String = "default") = {x + "!"}
method_with_default: (x: String)java.lang.String

scala> method_with_default()
res5: java.lang.String = default!

scala> method_with_default("value")
res6: java.lang.String = value!
我试图用val实现同样的效果,但我得到了一个语法错误,如下所示:

val functionWithDefault = new DefaultFunction1[String,String]("default") {
  override def apply(x:String) = x + "!"
}

abstract class DefaultFunction1[-A,+B](default:A)
               extends Function1[A,B] with Function0[B] {
  override def apply = apply(default)
}
(如果没有默认值,则此项编译为ok)

scala>val函数,默认值=(x:String)=>{x+“!”}
带有默认值的函数:String=>java.lang.String=
(但我无法编译这个…)

scala>val函数,默认值=(x:String=“default”)=>{x+“!”}
:1:错误:“)”应为“”,但找到“=”。
val函数_与_default=(x:String=“default”)=>{x+“!”}
^

有什么想法吗?

没有办法做到这一点。您所能得到的最好结果是一个对象,它扩展了
Function1
Function0
,其中
Function0
的apply方法使用默认参数调用另一个apply方法

val functionWithDefault = new Function1[String,String] with Function0[String] {
  override def apply = apply("default")
  override def apply(x:String) = x + "!"
}
如果您更经常需要此类函数,可以将默认的apply方法分解为抽象类
DefaultFunction1
,如下所示:

val functionWithDefault = new DefaultFunction1[String,String]("default") {
  override def apply(x:String) = x + "!"
}

abstract class DefaultFunction1[-A,+B](default:A)
               extends Function1[A,B] with Function0[B] {
  override def apply = apply(default)
}

Function1和Function0非常聪明,但我觉得有点臭。这里只有我的意见。无需讨论。:)顺便说一句,您可以使用sugar函数:
new(String=>String)和(()=>String){override def apply=apply(“默认”);override def apply(x:String)=x+“!”}
有效。我同意它有点臭,但我没有看到一个解决方案不是这样的。我会将问题修改为:不要这样做:)并使用惯用的Scala。尽管如此,您的解决方案仍然可以通过巧妙地使用curry和隐式转换来实现通用化。有什么原因导致Scala不支持这一点吗?这将使事情更加连贯和简单
val functionWithDefault = new DefaultFunction1[String,String]("default") {
  override def apply(x:String) = x + "!"
}

abstract class DefaultFunction1[-A,+B](default:A)
               extends Function1[A,B] with Function0[B] {
  override def apply = apply(default)
}