mis*_*tor 4 scala typeclass scalaz
例如,假设我想编写一个length
返回给定结构长度的函数,因为它Length
在范围内有一个类型为class (来自Scalaz)的实例.
这就是我目前定义它的方式:
scala> def length[A, F[_] : Length]: F[A] => Int = _.len
length: [A, F[_]](implicit evidence$1: scalaz.Length[F])F[A] => Int
Run Code Online (Sandbox Code Playgroud)
然而,诸如length(List(2, 3))
失败的调用因为在这种情况下隐式参数是所需的第一个参数.
scala> length(List(2, 3))
<console>:15: error: type mismatch;
found : List[Int]
required: scalaz.Length[?]
length(List(2, 3))
^
Run Code Online (Sandbox Code Playgroud)
我认为length(implicitly)(List(2, 3))
会起作用,但它最终导致崩溃(这种类型推断从左向右流动是可以理解的).提供显式类型注释有效,但它难以忍受.
scala> length(implicitly[Length[List]])(List(2, 3))
res16: Int = 2
Run Code Online (Sandbox Code Playgroud)
是否有一种编写第一类函数的好方法,例如length
,具有上下文绑定,可以像使用站点上的常规函数一样干净地调用它?(像length(List(2, 3))
)
容易,欺骗!
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
Run Code Online (Sandbox Code Playgroud)