【问题标题】:How do I use Name as an applicative?如何使用名称作为应用程序?
【发布时间】:2011-11-18 20:12:02
【问题描述】:
scala> val a = Need(20)
a: scalaz.Name[Int] = scalaz.Name$$anon$2@173f990

scala> val b = Need(3)
b: scalaz.Name[Int] = scalaz.Name$$anon$2@35201f

scala> for(a0 <- a; b0 <- b) yield a0 + b0
res90: scalaz.Name[Int] = scalaz.Name$$anon$2@16f7209

scala> (a |@| b)
res91: scalaz.ApplicativeBuilder[scalaz.Name,Int,Int] = scalaz.ApplicativeBuilde
r@11219ec

scala> (a |@| b) { _ + _ }
<console>:19: error: ambiguous implicit values:
 both method FunctorBindApply in class ApplyLow of type [Z[_]](implicit t: scala
z.Functor[Z], implicit b: scalaz.Bind[Z])scalaz.Apply[Z]
 and value nameMonad in object Name of type => scalaz.Monad[scalaz.Name]
 match expected type scalaz.Apply[scalaz.Name]
       (a |@| b) { _ + _ }
                 ^

NameMonad,因此也是 Applicative。为什么这段代码不起作用?我是否需要添加任何类型注释才能使其工作?谢谢!

【问题讨论】:

    标签: scala functional-programming monads scalaz applicative


    【解决方案1】:

    只是部分答案,我对scalaz不太熟悉。 (a |@| b)ApplicativeBuilder[Name, Int, Int]。您对apply(plus: (Int, Int) =&gt; Int) 的调用需要两个隐式参数,一个Functor[Name] 和一个Apply[Name](略小于Applicative,没有纯参数)。

    第二个有问题。由于Name 出现在Apply[Name] 类型中,伴随object Name 被认为是隐式范围,因此隐式val nameMonad: Monad[Name] 是在隐式范围内。由于Monad 扩展Applicative 扩展Apply,它是隐式参数的可能候选者。

    但由于Apply 出现在Apply[Name] 中,它的伴生对象Apply 也被认为是伴生对象object Apply。而在它的祖先ApplyLow中,有一个

    implicit def FunctorBindApply[Z[_]](implicit t: Functor[Z], b: Bind[Z]): Apply[Z] 
    

    Functor[Name]Bind[Name] 的实例存在于隐式范围中(nameMonad 是它们两者),因此FunctorBindApply 也提供了一个候选 Apply(它的行为与 nameMonad 完全一样,因为它完全基于它,但它仍然是另一个候选人)。

    我认为我并不真正了解优先级规则。在 ApplyLow 而不是 Apply 中定义会降低相对于伴随对象 Apply 中定义的内容的优先级。但与无关对象Name 中定义的内容无关。我不认为MonadApply 的子类型可以使它更具体。而且我认为没有其他规则可以在两者之间做出决定,但我必须承认我在这方面有点不知所措。编译器错误消息当然同意它可以在备选方案之间进行选择。

    不确定正确的解决方案应该是什么,但将nameMonad 直接放在范围内,例如import Name._ 应该优先考虑。

    【讨论】:

    • 在依赖隐式作用域时,我们还没有找到合理的解决方案来为我们提供正确的隐式优先级。显式导入类型类实例有时是唯一的方法。 Scalaz7 (code.google.com/p/scalaz/wiki/Scalaz7) 正在对新设计进行原型设计,以避免此问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 2017-01-15
    • 2014-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多