oxb*_*kes 6 scala type-inference scalaz
我一直在玩ListW.<^>,其定义如下:
def <^>[B: Zero](f: NonEmptyList[A] => B): B = value match {
case Nil => ?
case h :: t => f(Scalaz.nel(h, t))
}
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚如何Option选择Zero这个例子的类型
scala> case class CC(v : Int)
defined class CC
scala> val posns = List(CC(2), CC(5), CC(1))
posns: List[CC] = List(CC(2), CC(5), CC(1))
Run Code Online (Sandbox Code Playgroud)
所以现在我有了这些东西的清单.我的目标是,如果没有低于零的值且类似于Option[CC]最大值,则返回最小值/最大值posns,我获得None最小值.
scala> import scalaz._; import Scalaz._
import scalaz._
import Scalaz._
scala> implicit val CCOrder = new Order[CC] {
| def order(v1 : CC, v2 : CC) = orderBy( (v : CC) => v.v ).order(v1, v2)
| }
CCOrder: java.lang.Object with scalaz.Order[CC] = $anon$1@1e48d65
scala> posns.filter(_.v < 0) <^> (_.min)
res0: Option[CC] = None
scala> posns.filter(_.v > 0) <^> (_.max)
res1: Option[CC] = Some(CC(5))
Run Code Online (Sandbox Code Playgroud)
选项正是Zero我想要的类型!任何人都可以解释一下如何Option被typer选中?我没有在任何地方宣布它!
对于定义ListW#<^>和MA#min:
sealed trait MA[M[_], A] extends PimpedType[M[A]] {
def min(implicit r: Foldable[M], ord: Order[A]): Option[A] =
foldl1((x: A, y: A) => if (x ? y) x else y)
}
sealed trait ListW[A] extends PimpedType[List[A]] {
def <^>[B: Zero](f: NonEmptyList[A] => B): B = value match {
case Nil => ?
case h :: t => f(Scalaz.nel(h, t))
}
}
Run Code Online (Sandbox Code Playgroud)
以下是相关的推断类型,隐式转换和隐式参数.scalac -Xprint:typer将揭示这一点.
object test {
import scalaz._
import Scalaz._
case class CC(v: Int)
val posns = List(CC(2), CC(5), CC(1))
val filtered = posns.filter(((x$1: CC) => x$1.v.<(0)))
val listw = Scalaz.ListTo[CC](posns.filter(((x$1: CC) => x$1.v.<(0))))
listw.<^>[Option[CC]]{
(x$2: scalaz.NonEmptyList[CC]) =>
Scalaz.maImplicit[scalaz.NonEmptyList, CC](x$2).min(Foldable.NonEmptyListFoldable, CCOrder)
}(Zero.OptionZero[CC]);
}
Run Code Online (Sandbox Code Playgroud)
List@#<^>NonEmptyList[A] => B如果pimped列表非空,则运行提供的函数,否则返回Zerofor类型B.MA#min实际上返回Option[B]- 它是容器的一般功能,而不是特定的容器,NonEmptyList它可以返回一个B.
实现这一目标的更直接方法是MA#min直接致电.不幸的是,List已经有一个min函数,Scala 2.8中的新函数,因此MA没有类型提示就不会触发隐式视图:
posns.filter(_.v < 0).min
<console>:16: error: could not find implicit value for parameter cmp: Ordering[CC]
posns.filter(_.v < 0).min
(posns.filter(_.v < 0): MA[List, CC]).min
res7: Option[CC] = None
Run Code Online (Sandbox Code Playgroud)
这是在Scalaz中提供符号标识符的激励原因之一 - 它是命名空间的粗略形式!
附注:您可以简化实例的Order实例CC:
implicit val CCOrder: Order[CC] = orderBy(_.v)
CCOrder: scalaz.Order[CC] = scalaz.Orders$$anon$2@fc2528
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
236 次 |
| 最近记录: |