期待一个函数,但传递一个值

时间:2018-02-09 08:32:35

标签: scala scala-cats

我有以下特质定义:

trait Printable[A] { self =>
  def format(value: A): String

  def show() : String = "Hello"

  def contramap[B](func: B => A): Printable[B] =
    new Printable[B] {
      def format(value: B): String =
        self.format(func(value))
    }
}

和类型:

final case class Box[A](value: A)

以及它的隐式实现:

  implicit def boxPrintable[A](implicit p: Printable[A]) =
    p.contramap[Box[A]](_.value)  

contramap期望具有func: B => A的函数,并且值正在上面传递。编译器为什么不抱怨?

1 个答案:

答案 0 :(得分:3)

它是下划线。

请记住,_.valuex => x.value的简写,在这种情况下,这意味着......

(x:Box[A]) => x.value

...符合B => A B Box[A] AA的定义......好吧,{{1}}。它还没有解决,但编译器没有什么可抱怨的,因为代码中没有任何矛盾。