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
。看起来很棒,谢谢!