scala - 在 Set 但不是 List 上使用 scalaz 的 MA 方法时出现编译问题

标签 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

我收到以下错误:

Found: Int => Boolean
Required: Boolean => Boolean

方法的签名是:

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

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

最佳答案

看起来 MA[M[_],A] 中的 ASetBoolean >。在 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] 中的 AFunction1 的返回类型。 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/

相关文章:

json - 为什么我不能将 Map[String,Any] 序列化为 JSON?

java - PubSubException : io. grpc.StatusRuntimeException:不可用

json - 防止 JSON4S 跳过缺少字段的 JSON 对象

scala - 为什么scalaz-stream中有两种网络io的实现?

scala - 在 Scaladoc 中,如何链接到同一类中的方法?

scala - Spark - 随机数生成

scala - 如何将值元组与函数元组结合起来?

scala - 映射 Map 的单个条目

monads - 为什么验证会违反 monad 法则?

scalaz - 链接 Scalaz 镜头组操作