Scala 避免在映射操作上使用显式类型参数
我有一个Scala 避免在映射操作上使用显式类型参数,scala,functional-programming,implicit,scalaz,Scala,Functional Programming,Implicit,Scalaz,我有一个Span[a]数据类型,它跟踪类型a的最小值和最大值。因此,我需要A拥有一个ScalazOrder实例。下面是实现的样子: trait Span[A] { val min: A val max: A } object Span { def apply[A : Order](id: A): Span[A] = new Span[A] { override val min = id override val max = id } def apply[A :
Span[a]
数据类型,它跟踪类型a
的最小值和最大值。因此,我需要A
拥有一个ScalazOrder
实例。下面是实现的样子:
trait Span[A] {
val min: A
val max: A
}
object Span {
def apply[A : Order](id: A): Span[A] = new Span[A] {
override val min = id
override val max = id
}
def apply[A : Order](a: A, b: A): Span[A] = {
val swap = implicitly[Order[A]].greaterThan(a, b)
new Span[A] {
override val min = if (swap) b else a
override val max = if (swap) a else b
}
}
implicit def orderSpanSemigroup[A : Order]: Semigroup[Span[A]] = new Semigroup[Span[A]] {
override def append(f1: Span[A], f2: => Span[A]): Span[A] = {
val ord = implicitly[Order[A]]
Span(ord.min(f1.min, f2.min), ord.max(f1.max, f2.max))
}
}
}
apply
方法似乎可以按预期工作,因为我可以这样做:
val a = Span(1) // or Span.apply(1)
如果我尝试使用一个函子映射这个值,例如,选项[Int]
,它就会崩溃:
val b = 1.some map Span.apply
// could not find implicit value for evidence parameter of type scalaz.Order[A]
但是,我可以通过使用显式类型参数修复错误:
val c = 1.some map Span.apply[Int]
为什么会这样?有没有办法避免这个显式类型参数?我想知道这是否与我最初在尝试使用自己的隐式
Order
实例时遇到的问题有关。当然,它在Int
输入上也失败了,所以可能这只是参数化方法的一个限制。上下文将desugars绑定到一个隐式参数(在一个新的参数列表中),这会导致eta扩展混乱,所以您只能使用类型参数或1.some.map(Span()))
。啊。可悲的是,这就是原因。我只是试着自己手动扩展函数值,比如val spanFunc=[A](A:A)=>(隐式ord:Order[A])=>Span.apply(A)
,但是实现了。哦,好吧。