You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

询问Arrow.kt是否支持表示加载状态的三态数据类型

解决方案

1. 使用Arrow官方的AsyncResult类型

Arrow Core 提供了AsyncResult<E, A>类型,完美匹配你需要的三种状态:

  • AsyncResult.Loading:对应加载中状态
  • AsyncResult.Success(a: A):携带成功结果数据
  • AsyncResult.Failure(e: E):携带失败错误信息

使用示例:

import arrow.core.*

fun fetchRemoteData(): AsyncResult<Exception, String> {
    // 模拟加载中状态
    return AsyncResult.Loading
    // 模拟成功场景
    // return AsyncResult.Success("Fetched data successfully")
    // 模拟失败场景
    // return AsyncResult.Failure(Exception("Network connection failed"))
}

// 处理状态分支
fun processResult(result: AsyncResult<Exception, String>) = when(result) {
    is AsyncResult.Loading -> println("Data is loading...")
    is AsyncResult.Success -> println("Got data: ${result.value}")
    is AsyncResult.Failure -> println("Error occurred: ${result.error.message}")
}

2. 自定义密封类结合Arrow类型

如果AsyncResult不符合你的业务场景,也可以自定义密封类,同时复用ArrowEither的成功/失败逻辑:

import arrow.core.Either

sealed class DataState<out E, out T> {
    object Loading : DataState<Nothing, Nothing>()
    data class Success<out T>(val data: T) : DataState<Nothing, T>()
    data class Failure<out E>(val error: E) : DataState<E, Nothing>()

    // 扩展方法:转换为Either(仅成功/失败状态)
    fun toEither(): Either<E, T>? = when(this) {
        Loading -> null
        is Success -> Either.Right(data)
        is Failure -> Either.Left(error)
    }
}

// 使用示例
fun getLocalData(): DataState<IllegalStateException, List<String>> {
    return DataState.Loading
    // return DataState.Success(listOf("Item 1", "Item 2"))
    // return DataState.Failure(IllegalStateException("Local cache empty"))
}

关于Option<T>的局限性

你尝试用Option<T>作为Either右值的思路,确实无法区分“加载中”和“无数据”两种状态——None只能表达“不存在有效值”,但无法传递“正在加载”的状态语义,因此不适合这类三状态场景。

内容的提问来源于stack exchange,提问作者FarBen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 19:33:27