Kotlin 惯用箭

Kotlin 惯用箭,kotlin,functional-programming,arrow-kt,Kotlin,Functional Programming,Arrow Kt,我有以下方法: internal typealias MaybeError<T> = Either<GenericError, T> override fun createCompany(companyDomain: CompanyDomain): MaybeError<CompanyDomain> = checkCompany(companyDomain).map { it.toEntity() }.fold({ Either.left(it) }

我有以下方法:

internal typealias MaybeError<T> = Either<GenericError, T>

override fun createCompany(companyDomain: CompanyDomain): MaybeError<CompanyDomain> =
    checkCompany(companyDomain).map { it.toEntity() }.fold({ Either.left(it) }) { company ->
        with (companyRepository) {
            isCompanyExists(company).fold({ Either.left(it) }) { isExists ->
                if (isExists) return@with Either.left(CompanyNameExists(companyDomain))
                createCompany(company).fold({ Either.right(companyDomain) }) { Either.left(it) }
            }
        }
    }
内部类型别名MaybeError=
覆盖乐趣创建公司(公司域名:公司域名):MaybeError=
checkCompany(companyDomain).map{it.toEntity()}.fold({任择.left(it)}){company->
与(公司报告){
isCompanyExists(company).fold({orther.left(it)}){isExists->
如果(存在)return@with左(CompanyNameExists(companyDomain))
createCompany(company).fold({任择.右(companyDomain)}{任择.左(it)}
}
}
}

有没有更好/更惯用的方法来使用Arrow编写此文档?

重构很难,因为我只能假设使用的方法应该返回什么。但是我猜这些方法返回的是
MaybeError
。在这种情况下,我们可以省略
折叠({other.left(it)})
,我们可以使用
map
flatMap

internal typealias MaybeError<T> = Either<GenericError, T>

override fun createCompany(companyDomain: CompanyDomain): MaybeError<CompanyDomain> =
    checkCompany(companyDomain)
        .map { it.toEntity() }
        .flatMap { company ->
            companyRepository.isCompanyExists(company)
                .flatMap { isExists ->
                    if (isExists) {
                        MaybeError.left(CompanyNameExists(companyDomain))
                    } else {
                        companyRepository.createCompany(company)
                    }
                }
        }
内部类型别名MaybeError=
覆盖乐趣创建公司(公司域名:公司域名):MaybeError=
支票公司(公司域)
.map{it.toEntity()}
.flatMap{公司->
companyRepository.isCompanyExists(公司)
.flatMap{isExists->
如果(存在){
MaybeError.left(公司名称存在(公司域))
}否则{
companyRepository.createCompany(公司)
}
}
}

您是否尝试过使用
flatMap
而不是
fold
来处理尊重左侧的情况?正确,这些方法确实返回
MaybeError
。看起来很棒,谢谢!