询问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
相关产品推荐
相关产品推荐

