以下使用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
。方法完全相同:∀
,∋
和∈:
- 发生了什么?
答案 0 :(得分:3)
对于A
,MA[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)
我真的希望Seq
和Set
可以隐式转换为Function1
而不是继承它。
<强>更新强>
现在是fixed。