4

例如,假设我想编写一个length返回给定结构长度的函数,假设它Length在范围内有一个类型类(来自 Scalaz)的实例。

这就是我目前定义它的方式:

scala> def length[A, F[_] : Length]: F[A] => Int = _.len
length: [A, F[_]](implicit evidence$1: scalaz.Length[F])F[A] => Int

但是,诸如此类的调用length(List(2, 3))失败,因为在这种情况下,隐式参数是所需的第一个参数。

scala> length(List(2, 3))
<console>:15: error: type mismatch;
 found   : List[Int]
 required: scalaz.Length[?]
              length(List(2, 3))
                         ^

我认为length(implicitly)(List(2, 3))会起作用,但它最终导致会话崩溃(这是可以理解的,因为类型推断从左到右流动)。提供显式类型注释是可行的,但丑得难以忍受。

scala> length(implicitly[Length[List]])(List(2, 3))
res16: Int = 2

是否有一种编写一流函数的好方法,例如length具有上下文绑定的,可以像在使用站点上的常规函数​​一样干净地调用?(喜欢length(List(2, 3))

4

1 回答 1

6

轻点,作弊!

scala> def length[A, F[_] : Length]: F[A] => Int = _.len
length: [A, F[_]](implicit evidence$1: scalaz.Length[F])F[A] => Int

scala> List(2, 3) |> length
res0: Int = 2
于 2011-11-01T16:44:06.330 回答