以下内容使用 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
我收到以下错误:
Found: Int => Boolean
Required: Boolean => Boolean
∃
方法的签名是:
def ∃(p: A => Boolean)(implicit r: FoldRight[M]): Boolean = any(p)
并且范围内应该有一个隐式的SetFoldRight
。方法完全相同:∀
、∋
和 ε:
- 发生了什么?
最佳答案
看起来 MA[M[_],A]
中的 A
是 Set
的 Boolean
>。在 Scalaz
object ,有以下隐式:
implicit def Function1ApplyMA[A, R](f: A => R): MA[PartialApply1Of2[Function1, A]#Apply, R] = ma[PartialApply1Of2[Function1, A]#Apply, R](f)
现在我不完全理解这里的类型是怎么回事,但看起来 MA[M[_],A]
中的 A
是Function1
的返回类型。 Set[A]
扩展了 A => Boolean
,因此为什么 ∃
定义中的 A
被推断为 bool 值
。
一个解决方法是使用显式 ma
方法将 Set 转换为 MA
,而不是让隐式函数完成繁重的工作:
val s = ma(Set(1, 2, 3))
关于scala - 在 Set 但不是 List 上使用 scalaz 的 MA 方法时出现编译问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2682487/