Kotlin编译器显示编译错误并建议;将类型从';T';至';"';而上下文中只有一个T

Kotlin编译器显示编译错误并建议;将类型从';T';至';"';而上下文中只有一个T,kotlin,compiler-errors,type-inference,Kotlin,Compiler Errors,Type Inference,我试图从Haskell实现一些类型类,但遇到的问题可能是Kotlin编译器中的一个bug 接口半群{ infix-fun-Instance.assocOp(oother:Instance):实例 } inline fun Iterable.concat()=this.reduce{acc:T,T:T->acc.assocOp(T)} 错误消息为“类型T的预期参数” IDEA建议“将类型从'T'更改为'T'”(什么也不做) 我希望acc属于泛型中提到的类型T。但由于某些原因,编译器试图找到其他类

我试图从Haskell实现一些类型类,但遇到的问题可能是Kotlin编译器中的一个bug

接口半群{
infix-fun-Instance.assocOp(oother:Instance):实例
}
inline fun Iterable.concat()=this.reduce{acc:T,T:T->acc.assocOp(T)}
错误消息为“类型T的预期参数”

IDEA建议“将类型从'T'更改为'T'”(什么也不做)

我希望
acc
属于泛型中提到的类型
T
。但由于某些原因,编译器试图找到其他类型的
T
。我试着

  • 显式/隐式指定类型
  • 构建忽略想法消息
  • 更改Kotlin编译器的旧版本(我已经尝试过1.4.20、1.4.10、1.3.72)
什么都没用


我认为在不使用
reduce
(手动)的情况下编写函数可能有助于处理它。同样,编写java代码也可以帮助缓解问题。但这些解决方案只是解决问题的变通办法。这个问题是我的错还是编译器的错误?

编译器的错误在这里显然没有帮助。然而,代码不应该编译IMO是正确的

您正在将方法
assocOp
定义为。扩展适用于任何类型
T
,但它是接口
半组的成员

要调用该扩展,您需要一个接收方或类型
T
和一个类型
半群
(充当上下文)的接收方

在您的例子中,类型
T
既扮演泛型类型参数的角色,又扮演
半群的角色,但是您的扩展仍然需要有两个“接收器”,即使这两个都是相同的实例

也许可以试试这个:

inlinefuniterable.concat():T=
用(t1){t1.assocOp(t2)}减少{t1:T,t2:T->

带有(t1){…}
提供了类型为
半群的上下文,而
t1中使用的
t1
。assocOp(t2)
充当
T
接收器。

请不要发布代码的屏幕截图,它是不可搜索的。您应该将代码片段和错误消息复制到您的问题中。@Joffrey我认为它不会通过链接显示,而是按原样显示。但我错了。下次我会听从你的建议@这确实是一个链接,但它仍然和内联截图一样错误。你说的是我们在这篇文章中读不到的代码。该代码在此状态下不可搜索。请使用代码块粘贴您的代码片段,并复制粘贴错误消息,以便其他人可以更轻松地找到您的问题和答案。您仍然可以编辑问题以解决此问题;)@Joffrey很抱歉耽搁了这么长时间,但我在你上一条消息后找不到编辑按钮,所以我没有编辑它。然而,在你的提示下,我现在已经找到并编辑了它。非常感谢。非常感谢。(我不小心忘了感谢)