我试图从Haskell实现一些类型类,但是遇到了可能是Kotlin编译器中的错误的问题。我希望acc
属于泛型中提到的T
类型。但是由于某种原因,编译器试图找到其他类型的T
。我尝试过了
没事。
我想(手动)编写不带
reduce
的函数可能有助于处理它。同样,编写相同的Java代码可能有助于减轻问题。但是这些解决方案只是解决该问题的方法。是我的问题还是编译器错误?Illustration of the probable bug
最佳答案
编译器错误显然对这里没有帮助。但是,该代码不应编译IMO是正确的。
您正在将assocOp
方法定义为member extension function。该扩展名适用于任何类型T
,但它是Semigroup<T>
接口(interface)的成员。
要调用该分机,您既需要一个接收器或类型T
,又需要一个接收器类型Semigroup<T>
(充当上下文)。
在您的情况下,T
类型既扮演泛型类型参数又扮演Semigroup<T>
角色,但是您的扩展名仍然需要2个“接收者”,即使它们都是同一实例。
也许试试这个:
inline fun <reified T : Semigroup<T>> Iterable<T>.concat(): T =
reduce<T, T> { t1: T, t2: T -> with(t1) { t1.assocOp(t2) } }
with(t1) { ... }
提供了Semigroup<T>
类型的上下文,而t1
中使用的t1.assocOp(t2)
充当T
接收者。