我试图从Haskell实现一些类型类,但是遇到了可能是Kotlin编译器中的错误的问题。我希望acc属于泛型中提到的T类型。但是由于某种原因,编译器试图找到其他类型的T。我尝试过了

  • 明确/隐式指定类型
  • 构建忽略IDEA消息
  • 更改使用的Kotlin编译器版本(我尝试过1.4.20、1.4.10、1.3.72)。

  • 没事。
    我想(手动)编写不带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接收者。

    10-04 23:00
    查看更多