在Set上使用scalaz的MA方法而不是List的编译问题

时间:2010-04-21 11:36:35

标签: scala scalaz

以下使用scala Beta1和scalaz snapshot 5.0进行编译很好:

val p1: Int => Boolean = (i : Int) => i > 4

val s: List[Int] = List(1, 2, 3)
val b1 = s ∃ p1

但事实并非如此:

val s: Set[Int] = Set(1, 2, 3)
val b1 = s ∃ p1

我收到以下错误:

  

找到:Int =>布尔
  必需:布尔值=>布尔

方法的签名是:

def ∃(p: A => Boolean)(implicit r: FoldRight[M]): Boolean = any(p)

范围内应该有一个隐含的SetFoldRight。方法完全相同:∈: - 发生了什么?

2 个答案:

答案 0 :(得分:3)

对于AMA[M[_],A]中的Boolean似乎是Set。在Scalaz object中,隐含了以下内容:

implicit def Function1ApplyMA[A, R](f: A => R): MA[PartialApply1Of2[Function1, A]#Apply, R] = ma[PartialApply1Of2[Function1, A]#Apply, R](f)

现在我并不完全了解这里的类型会发生什么,但看起来A中的MA[M[_],A]Function1的返回类型。 Set[A]扩展了A => Boolean,因此A定义中的被推断为Boolean

一种解决方法是使用显式ma方法将Set转换为MA,而不是让implicits执行繁重的工作:

val s = ma(Set(1, 2, 3))

答案 1 :(得分:3)

我需要将其添加到object Scalaz

implicit def SetMA[M[_] <: Set[_], A](s: M[A]): MA[M, A] = ma[M, A](s)

但是,多亏了#2741,我遇到了一个问题,它的优先级高于违规转换:

implicit def Function1ApplyMA[A, R](f: A => R): MA[PartialApply1Of2[Function1, A]#Apply, R]  = ma[PartialApply1Of2[Function1, A]#Apply, R](f)

我真的希望SeqSet可以隐式转换为Function1而不是继承它。

<强>更新

现在是fixed