方法定义有什么问题

时间:2016-10-22 18:49:35

标签: scala traversal applicative monoids

以下是我在scala中的方法签名和定义

  def accumulate[T[_]: Traversable, O: Monoid, A]: (A => O) => T[A] => O =
    fao => ta =>
      (implicitly[Traversable[T]].traverse[({type f[X] = Acc[O, X]})#f, A, O](ta)(a => Acc(fao(a)))).value

  def reduce[T[_]: Traversable, O: Monoid]: T[O] => O = to => accumulate[T, O, O](a => a)(to)

但是我对reduce

的定义出现以下错误
Error:(160, 82) not enough arguments for method accumulate: (implicit evidence$7: Traversable[T], implicit evidence$8: Monoid[O])(O => O) => (T[O] => O).
Unspecified value parameter evidence$8.
  def reduce[T[_]: Traversable, O: Monoid]: T[O] => O = to => accumulate[T, O, O](a => a)(to)
                                                                                 ^

不确定我哪里出错了。任何帮助,将不胜感激。

谢谢!

1 个答案:

答案 0 :(得分:2)

您将被隐藏(隐式)参数绊倒到accumulate方法。您放置在它上面的上下文意味着方法真的具有以下类型签名:

def accumulate[T[_], O, A](
  implicit traversable: Traversable[T],
  monoid: Monoid[O]): (A => O) => T[A] => O

事实上,如果您确实需要在方法中使用相应的含义(而不是隐式地将它们传递给另一个方法),我建议您使用上下文边界。明确地(具有讽刺意味)明确指出含义更清楚。

所以,reduce中发生的事情是你试图在编译器期望{{{}的两个隐式参数的位置传入函数a => a。 1}}和Traversable[T]。解决方案是要么明确地传入implicits,要么在调用它之前 monomorphise Monoid[O]

accumulate