【问题标题】:Compilation issues using scalaz's MA methods on Set but not List在 Set 但不是 List 上使用 scalaz 的 MA 方法的编译问题
【发布时间】:2010-04-21 11:36:35
【问题描述】:

以下使用 scala Beta1 和 scalaz 快照 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。方法完全相同:∈: - 这是怎么回事?

【问题讨论】:

    标签: scala scalaz


    【解决方案1】:

    看起来MA[M[_],A] 中的ABoolean 对于Set。在Scalazobject中,隐含如下:

    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 被推断为Boolean

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

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

    【讨论】:

    • 我明白了 - 我知道这与 Set 扩展 A => Boolean 的事实有关。您指定的隐式从Function[I, R]. M[_]` 创建一个MA[M[_], A] 被推断为PartialApply1Of2,这使得MA 的第二个类型参数为RR 当然是 Function1 的返回类型,在这种情况下是 Boolean
    【解决方案2】:

    我需要将此添加到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

    【讨论】:

    • 我认为成员方法也应该有一个“更干净”的基于集合的实现——即它们不使用FoldRight,而是使用Set是@的事实987654331@。并不是说我知道如何做到这一点:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    • 2015-08-01
    • 2014-12-27
    • 2013-08-13
    • 2021-08-25
    相关资源
    最近更新 更多