2016-10-22 57 views
1

下面是我的方法签名和定义阶什么是错的方法定义

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) 

但是我得到了我的定义,下面的错误减少

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

它会更容易,如果你提供一个参考Traversable的/含半幺群/累加器的实现,据我所知Scala的内置尽管Scalaz和Cat中的遍历类型类可以遍历,但没有遍历方法。 –

+0

@AngeloGenovese假设只有一个(合法的)“Traversable”或“Monoid”的实现是可以安全的,他可以在这里指出这是通常可以在'scalaz'或'cats'中找到的实现。 – Yawar

+0

@Yawar公平的,但这也意味着为了试图重现他的问题,我花时间弄清楚了什么样的Acc,并且记住Scala集合Traversable与Traverse类型不一样。奇怪的是,使用cat和一个虚拟imp的Acc我没有在scala 2.10上得到相同的编译错误。 (从头开始,只是我的IDE隐藏了我的东西) –

回答

2

您正在被隐藏(隐含)参数绊倒到accumulate方法。上下文界定你放在它意味着真的有以下类型签名的方法:

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

其实我建议,如果你实际上需要使用你使用情境界定它们在你的方法中的相应含义(而不是将它们隐式地传递给另一种方法)。明确地(有讽刺意味地)输入含义更清楚。

那么,正在发生的事情reduce是,你试图在功能a => a通过在编译器期待的Traversable[T]Monoid[O]两个隐含参数的位置。该解决方案是在implicits传递明确,或monomorphiseaccumulate调用前:

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) 
} 
+0

谢谢!这样可行。但为什么这不起作用 积累(Traversable [T],Monoid [O])(a => a)(to)以及您写的内容。这给我一个编译错误。 –

+0

@AbdulRahman嗯,也许'Traversable.apply'和'Monoid.apply'没有被定义为返回正确的含义?你能发布编译错误消息吗? – Yawar

+0

错误:(162,27)对象Traversable不带类型参数。 累积(Traversable [T],Monoid [O])(a => a)(to) 错误:(162,38)对象Monoid不带类型参数。 (a => a)(to) ^ –

相关问题