如何使用箭头类型类?

How to use arrow's type classes?

我正在尝试熟悉 arrow-kt 库,但我太笨了,无法完成最简单的事情:使用一种内置类型 classes,即 'Show' 我使用 @extension 注释对 kapt 进行了尝试,并且 kapt 本身正在按预期生成必要的代码,但是缺少对扩展函数 'show(): String' 的引用。 有人可以帮我解决这个问题吗?我浪费了两天时间才开始工作。

非常感谢!

此致

亚历克斯

待扩展的class:

package org.hudelundpfusch.sqwakkel.arrowtest

import arrow.extension
import arrow.typeclasses.Show

class Fump(private val fumpel: String) {

    companion object {}

    override fun toString(): String {
        return "Fump(fumpel='$fumpel')"
    }

}

@extension
interface FumpShow
    : Show<Fump> {
    override fun Fump.show(): String = toString()
}

这里我想使用扩展功能:

package org.hudelundpfusch.sqwakkel.arrowtest

class Gump {

    private val fump: Fump = Fump("Fumpel!")

    fun gumpel(): String = fump.show()

}

但是缺少对 'fump.show()' 的引用 =(

你不见了show.run { }。要使接口中定义的扩展函数起作用,您需要在它们的范围内,使用 run 或在您使用它的地方制作 class 扩展它。要么

class Gump: FumpShow

Fump.show().run { fump.show() }

应该会给你想要的结果。

另一种选择是导入 Arrow Meta 处理器使用 @extension 为您创建的 show 函数。确保在 build.gradle

中正确配置它
kapt "io.arrow-kt:arrow-meta:$arrow_version"

然后它应该像从 IntelliJ 的建议中导入 show 一样简单。

非常感谢,El Paco!

但我不得不承认这对我来说有点违反直觉... =/

我现在采用了这种方法:

package org.hudelundpfusch.sqwakkel.arrowtest

import org.hudelundpfusch.sqwakkel.arrowtest.fump.show.show

object FumpShowInstance : FumpShow

class Gump {

    private val fump: Fump = Fump("Fumpel!")

    fun gumpel(): String = FumpShowInstance.run { fump.show() }

}

fun main(args: Array<String>) {
    val gump: Gump = Gump();
    println("${gump.gumpel()}")
}

此致

亚历克斯