scalaz.Equal[Foo] 的构造实现

Constructing Implementation of scalaz.Equal[Foo]

给出以下 class:

scala> class Foo(x: Int) { def getX = x }
defined class Foo

我创建了一个 implicit Equal[Foo] 以便能够使用 ===

scala> implicit val FooEq: Equal[Foo] = Equal.equal(_.getX == _.getX)
FooEq: scalaz.Equal[Foo] = scalaz.Equal$$anon@6a246ad

有效。

scala> new Foo(10) === new Foo(10)
res2: Boolean = true

scala> new Foo(10) === new Foo(4545)
res3: Boolean = false

但是,我对 FooEq 的创建方式感到困惑。

Equal.equal(_.getX == _.getX) 发生了什么事?我不确定该声明如何 returns 和 Equal[Foo].

Equal.equal 的类型签名是 def equal[A](f: (A, A) => Boolean): Equal[A]。因此,您传递的方法需要两个 Foo 并将 Boolean 返回给 equals,后者返回 Equal[Foo] 的实例。这就是发生的事情,这就是声明 returns 和 Equal[Foo].

的方式

Here's some code that you've written using similar syntax.