Scala 如何覆盖';应用';在具有多个参数列表的函数中?

Scala 如何覆盖';应用';在具有多个参数列表的函数中?,scala,currying,Scala,Currying,我正在尝试创建此类型函数对象的实例: trait CanGetSiblingDock[S, D] extends (D => String => S => Option[D]) 为此: implicit val getSiblingDock = new CanGetSiblingDock[Situation, Dock] { def apply(dock: Dock)(siblingName: String)(sit: Situation): Option[Dock]

我正在尝试创建此类型函数对象的实例:

trait CanGetSiblingDock[S, D]
  extends (D => String => S => Option[D])
为此:

implicit val getSiblingDock = new CanGetSiblingDock[Situation, Dock] {
  def apply(dock: Dock)(siblingName: String)(sit: Situation): Option[Dock] = ???
}
编译器对象:

error: object creation impossible, since method apply in trait Function1 of type (v1: FARG.Dock)String => (TestFARGModel4.this.Situation => Option[FARG.Dock]) is not defined
(Note that T1 does not match FARG.Dock)
  implicit val getSiblingDock = new CanGetSiblingDock[Situation, Dock] {
                                    ^
如果我理解正确,编译器会抱怨
apply
的第一个参数不是
Dock
类型。不过,在我看来,情况确实如此

显然,我在某个地方误解了什么。如何正确创建具有多个参数列表的函数实例?

类似于:

scala> trait F extends (String => Int => Int)
defined trait F

scala> object X extends F { def apply(s: String): Int => Int = ??? }
defined object X
比如:

scala> trait F extends (String => Int => Int)
defined trait F

scala> object X extends F { def apply(s: String): Int => Int = ??? }
defined object X

类型
A=>B=>C
不是
Function2[A,B,C]
,其
apply
方法将是
def apply(A:A,B:B):C
。但是这是
Function1[A,Function1[B,C]]
,就像一个curried函数。如果您想要
功能2
,您必须编写:

trait Foo extends Function2[Int, String, Boolean] {
  override def apply(a: Int, b: String): Boolean = ???
}
如果现在需要多个参数列表,则必须重载
apply

trait Foo extends Function2[Int, String, Boolean] {
  override def apply(a: Int, b: String): Boolean = ???

  def apply(a: Int)(b: String): Boolean = apply(a, b)
}

这是不可能的,因为在擦除之后,这两种方法在字节码级别上看起来是相同的。

类型
A=>B=>C
不是
Function2[A,B,C]
,而
apply
方法将是
def apply(A:A,B:C)
。但是这是
Function1[A,Function1[B,C]]
,就像一个curried函数。如果您想要
功能2
,您必须编写:

trait Foo extends Function2[Int, String, Boolean] {
  override def apply(a: Int, b: String): Boolean = ???
}
如果现在需要多个参数列表,则必须重载
apply

trait Foo extends Function2[Int, String, Boolean] {
  override def apply(a: Int, b: String): Boolean = ???

  def apply(a: Int)(b: String): Boolean = apply(a, b)
}

这是不可能的,因为在擦除之后,这两种方法在字节码级别上看起来是相同的。

基本上,您是在使用curry吗?是的,
A=>B=>C
的意思是
A=>(B=>C)
。这很有效!哇,自从我第一次使用Scala已经两年了,我仍然猜不出我没有尝试过的东西的语法。谢谢基本上,你是咖喱?是的,
A=>B=>C
的意思是
A=>(B=>C)
。这很有效!哇,自从我第一次使用Scala已经两年了,我仍然猜不出我没有尝试过的东西的语法。谢谢我会像对另一个人那样评论,基本上,你是咖喱?嗯,它的定义是,它是对的。我会像对另一个人那样评论,基本上,你是咖喱?嗯,它的定义是,它是正确的。