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
拥有一个Scalaz
Order
实例。下面是实现的样子:

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)
,但是实现了。哦,好吧。