如何使用箭头类型类?
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()}")
}
此致
亚历克斯
我正在尝试熟悉 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()}")
}
此致
亚历克斯