箭头验证超过 10 个字段

Vic*_*lyk 1 validation kotlin arrow-kt

我有一个问题,如何在 kotlin 中使用箭头验证超过 10 个值。

fun CreateEventDTO.validate(): Validated<IncorrectInput, CreateEventDTO> =
  name.isEventNameValid()
    .zip(
      about.isAboutValid(),
      phone.isPhoneValid(),
      price.isPriceValid(),
      location.isLocationValid(),
      startDate.isStartDateValid(),
   // TODO add common validation for date
      // endDate.isEndDateValid(),
      status.isEventStatusValid(),
      access.isEventAccessValid(),
      category.isEventCategoryValid(),
      musicStyles.isMusicStyleValid()
    )
    { name, _, _, price, location, status, access, category, musicStyles ->
      CreateEventDTO(
        name = name,
        about = about,
        phone = phone,
        price = price,
        location = location,
        startDate = startDate,
        endDate = endDate,
        status = status,
        access = access,
        category = category,
        musicStyles = musicStyles
      )
    }
    .mapLeft(ApiError::IncorrectInput)
Run Code Online (Sandbox Code Playgroud)

如果我尝试再添加一个验证,则会收到错误消息,因为 zip 最多允许 10 个值

Required:
Semigroup<TypeVariable(E)>
Found:
ValidatedNel<InvalidAbout, String?> /* = Validated<NonEmptyList<InvalidAbout>, String?> */
Run Code Online (Sandbox Code Playgroud)

还有其他优雅的方法来处理这个问题吗?

nom*_*Rev 5

Kotlin 要求所有函数都必须显式定义,我们不能定义无限数量的方法。因此 Arrow 决定将参数限制为 9 个。

但是,您可以zip使用元组轻松地将不同的方法组合在一起。要达到 10 个参数,您可以9 + 2按以下方式组合。

fun CreateEventDTO.validate(): Validated<IncorrectInput, CreateEventDTO> =
  name.isEventNameValid()
    .zip(
      about.isAboutValid(),
      phone.isPhoneValid(),
      price.isPriceValid(),
      location.isLocationValid(),
      startDate.isStartDateValid(),
      endDate.isEndDateValid(),
      status.isEventStatusValid(),
      access.isEventAccessValid(),
      category.isEventCategoryValid().zip(musicStyles.isMusicStyleValid(), ::Pair)
    )
    { name, _, _, price, location, startDate, endDate, status, access, (category, musicStyles) ->
      CreateEventDTO(
        name = name,
        about = about,
        phone = phone,
        price = price,
        location = location,
        startDate = startDate,
        endDate = endDate,
        status = status,
        access = access,
        category = category,
        musicStyles = musicStyles
      )
    }
    .mapLeft(ApiError::IncorrectInput)
Run Code Online (Sandbox Code Playgroud)