方法定义有什么问题
What is wrong with the method definition
下面是我在 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: Traversable[T], implicit evidence: Monoid[O])(O => O) => (T[O] => O).
Unspecified value parameter evidence.
def reduce[T[_]: Traversable, O: Monoid]: T[O] => O = to => accumulate[T, O, O](a => a)(to)
^
不确定我哪里出错了。任何帮助,将不胜感激。
谢谢!
您被 accumulate
方法的隐藏(隐式)参数绊倒了。您放置在其上的上下文边界意味着方法 really 具有以下类型签名:
def accumulate[T[_], O, A](
implicit traversable: Traversable[T],
monoid: Monoid[O]): (A => O) => T[A] => O
事实上,如果您确实需要在您的方法中使用相应的隐含函数(而不是将它们隐式传递给另一种方法)。明确地(具有讽刺意味的)输入隐式要清楚得多。
所以,reduce
中发生的事情是您试图在编译器期望 Traversable[T]
和 Traversable[T]
的两个隐式参数的位置传入函数 a => a
Monoid[O]
。解决方案是显式传递隐含函数,或者在调用它之前 monomorphise accumulate
:
def reduce[T[_]: Traversable, O: Monoid]: T[O] => O = { to =>
// This forces the compiler to pass in the correct implicits
val accumulate_ = accumulate[T, O, O]
accumulate_(a => a)(to)
}
下面是我在 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: Traversable[T], implicit evidence: Monoid[O])(O => O) => (T[O] => O).
Unspecified value parameter evidence.
def reduce[T[_]: Traversable, O: Monoid]: T[O] => O = to => accumulate[T, O, O](a => a)(to)
^
不确定我哪里出错了。任何帮助,将不胜感激。
谢谢!
您被 accumulate
方法的隐藏(隐式)参数绊倒了。您放置在其上的上下文边界意味着方法 really 具有以下类型签名:
def accumulate[T[_], O, A](
implicit traversable: Traversable[T],
monoid: Monoid[O]): (A => O) => T[A] => O
事实上,如果您确实需要在您的方法中使用相应的隐含函数(而不是将它们隐式传递给另一种方法)。明确地(具有讽刺意味的)输入隐式要清楚得多。
所以,reduce
中发生的事情是您试图在编译器期望 Traversable[T]
和 Traversable[T]
的两个隐式参数的位置传入函数 a => a
Monoid[O]
。解决方案是显式传递隐含函数,或者在调用它之前 monomorphise accumulate
:
def reduce[T[_]: Traversable, O: Monoid]: T[O] => O = { to =>
// This forces the compiler to pass in the correct implicits
val accumulate_ = accumulate[T, O, O]
accumulate_(a => a)(to)
}