如何使用箭头的类型类?

时间:2019-07-22 20:38:14

标签: kotlin arrow-kt

我试图熟悉arrow-kt库,但是我很愚蠢地完成了最简单的事情:使用内置的类型类之一,即“ Show” 我使用@extension注释使用kapt进行了尝试,并且kapt本身正在按预期生成必要的代码,但是缺少对扩展功能'show():String'的引用。 有人可以帮我解决这个问题吗?我浪费了两天让它开始工作。

非常感谢您!

最诚挚的问候

亚历克斯

要扩展的类:

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()'的引用=(

2 个答案:

答案 0 :(得分:3)

您缺少show.run { }。为了使接口中定义的扩展功能正常工作,您需要使用run或在使用它的类中对其进行扩展,以使其扩展。要么

class Gump: FumpShow

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

应该给您想要的结果。

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

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

然后应该像从IntelliJ的建议中导入show一样容易。

答案 1 :(得分:0)

非常感谢,埃尔帕科!

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

我现在结束了这种方法:

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()}")
}

最诚挚的问候

亚历克斯