代码之家  ›  专栏  ›  技术社区  ›  oxbow_lakes

使用scalaz的ma方法在set而非list上编译问题

  •  2
  • oxbow_lakes  · 技术社区  · 15 年前

    下面使用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 回复  |  直到 15 年前
        1
  •  3
  •   oxbow_lakes    15 年前

    看起来像 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] 是的返回类型 Function1 . Set[A] 延伸 A => Boolean 所以为什么 在定义中 ∃ 被推断为 布尔值 .

    一个解决方法是使用显式 ma 方法将集合转换为 MA 而不是让牵连者做重担:

    val s = ma(Set(1, 2, 3))
    
        2
  •  3
  •   retronym    15 年前

    我需要把这个加到 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 .

    推荐文章