Я хотел бы использовать тип данных Cats ValidatedNec
аналогично примеру в документации Cats для Validated
в разделе Встреча аппликативная - в моем случае я анализирую String
s из файла, проверяя соответствующее регулярное выражение для поля, а затем (для нескольких полей) преобразование в другой тип данных (при условии совпадения регулярного выражения). Однако вместо использования case object
s, которые расширяют общий признак для недопустимых результатов (как в примере), я хотел бы использовать case class
es (которые расширяют общий признак), чтобы я мог включать контекстную информацию в случае неудачи. Можно ли это сделать так же просто, как вызвать все методы проверки (поместить результаты в кортеж), как в примере validateForm
, и вызвать mapN
? Я получаю противоречивые ошибки от Intellij (от IntelliJ, он говорит мне, что ожидаемые и фактические параметры для mapN
одинаковы (хотя он по-прежнему помечает это как ошибку); при запуске sbt
в командной строке это не разрешается метод mapN
. Я использую Scala 2.12.8 и кошек 2.0.0-M1. Буду признателен за любую помощь!
https://gist.github.com/ДмытроМитин/6cf51c3563dba62307a2a256eeb4ebb5
«Ошибки IntelliJ» не имеют значения.
Что касается «ошибок sbt», чтобы заставить mapN
работать, убедитесь, что у вас есть
import cats.syntax.apply._
Если это по-прежнему не работает, укажите свой MCVE.
Прошу прощения за столь долгий ответ, но вот ссылка на суть, которая воссоздает ошибку компиляции, с которой я столкнулся (ValidationExample.scala:47:35: value mapN is not a member of (ValidatorNec.this.ValidationResult[java.time.LocalDateTime], ValidatorNec.this.ValidationResult[Double]) [error] possible cause: maybe a semicolon is missing before
value mapN'?`)
@TimothyPerrigo Если вы импортировали cats.implicits._
, вам не следует импортировать cats.syntax.apply._
, иначе вы создадите двусмысленность. Если вы удалите импорт, ошибка будет type mismatch; found : App.Reading.type required: (java.time.LocalDateTime, Double) => App.Reading
. Итак, по какой-то причине компилятор не распознает Reading
как функцию.
@TimothyPerrigo Если вы замените Reading
на Reading(_,_)
, у вас будет type mismatch; found : java.time.LocalDateTime required: java.time.LocalDate
, и вы увидите, что ваше определение класса case Reading
неверно.
@ТимотиПерриго gist.github.com/ДмытроМитин/6cf51c3563dba62307a2a256eeb4ebb5
О боже... Прошу прощения за то, что упустил такую простую вещь! Спасибо за вашу помощь!
У меня есть
cats.syntax.apply._
импортный; ошибка, которую я получаю от sbt после вызова всех методов проверки (с результатами в кортеже), — этоpossible cause: maybe a semicolon is missing before
value mapN'?`. Я отправлю MCVE, как только у меня будет шанс. Спасибо за ответ!