gpt4 book ai didi

kotlin - Kotlin箭头IO,IO.fx,IO效果之间的区别

转载 作者:行者123 更新时间:2023-12-02 13:04:39 30 4
gpt4 key购买 nike

我正在尝试在Kotlin中使用箭头
箭有三个功能

IO {}
IO.fx {}
IO.fx { !effect}
我想知道两者之间的区别。我知道IO.fx和IO.fx {!effect}可以帮助我们使用副作用,但是两者之间有什么区别,为什么我要在另一个上使用

最佳答案

尽管这将很快改变,但在版本0.11.X上:

  • IO { }是一个带有暂停函数的构造函数,因此您可以在内部调用任何暂停函数。这是IO.effect { }
  • 的快捷方式
    suspend fun bla(): Unit = ...

    fun myIO(): IO<Unit> = IO { bla() }

    fun otherIO(): IO<Unit> = IO.effect { bla() }
  • IO.fx { }IO相同,只是它添加了一些DSL功能,这些功能是IO其他API的快捷方式。最重要的是!bind,它在内部执行另一个IO。
  • fun myIO(): IO<Unit> = IO.fx { bla() }

    fun nestIO(): IO<IO<Unit>> = IO.fx { myIO() }

    fun unpackIO(): IO<Unit> = IO.fx { !myIO() }
    它启用的另一个功能是从第一点开始的构造函数 effect。因此,您实际上正在做的是添加可能不需要的附加包装层。
    fun inefficientNestIO(): IO<IO<Unit>> = IO.fx { effect { bla() } }

    fun inefficientUnpackedIO(): IO<Unit> = IO.fx { !effect { bla() } }
    我们经常看到来自支持 channel 的人的 inefficientUnpackedIO,很容易用 IO { bla() }替换。
    为什么在 effectfx中有两种相同的方法?我们希望在下一个发行版中对此进行改进。我们建议尽可能使用功能最弱的抽象,因此仅在使用其他基于 fx的API(例如调度或并行化)时保留 IO
    IO.fx {
    val id = getUserIdSuspend()
    val friends: List<User> =
    !parMapN(
    userFriends(id),
    IO { userProfile(id) },
    ::toUsers
    )
    !friends.parTraverse(IO.applicative()) { user ->
    IO { broadcastStatus(user) }
    }
    }

    关于kotlin - Kotlin箭头IO,IO.fx,IO效果之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63676633/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com