У меня есть рабочий процесс, как это:Успех/неудача картины цепи в Scala
parse template -> check consistency
-> check conformance of one template to another
parse template -> check consistency
Либо один из этих шагов может потерпеть неудачу. Я хотел бы реализовать это в Scala, желательно, чтобы параллельные ветви оценивались независимо друг от друга, объединяя обе свои ошибки. Возможно, в монадическом стиле, но мне любопытно и об общем шаблоне ООП. В настоящее время у меня есть несколько вариантов жёстко прописанных для различных действий с цепочкой, как этого
def loadLeftTemplateAndForth (leftPath : String, rightPath : String) = {
val (template, errors) = loadTemplate(leftPath)
if(errors.isEmpty) loadRightTemplateAndForth(template, rightPath)
else popupMessage("Error.")
}
который я ставка должна быть каким-то антипаттерны. Шагам нужно отделить от рабочего процесса, но я не смог придумать что-нибудь чрезвычайно элегантное, и уже должны быть проверены пути.
EDIT: Ok, так что я безуспешно пытался реализовать что-то вроде этого
(((parseTemplate(path1) :: HNil).apply(checkConsistency _) :: ((parseTemplate(path2) :: HNil).apply(checkConsistency _)) :: HNil).apply(checkConformance _)
def checkConformance (t1 : Template)(t2 : Template) : Seq[Error]
функции затем вернуть успех (результат) или Failure (ошибки). Я использовал HLists, но потерялся в правилах вывода типов и других проблемах. Кажется, я был довольно близок. Для кого-то, кто знал об этом, вероятно, это был бы кусок пирога.
EDIT: я, наконец, удалось осуществить эту
(parseTemplate("Suc") :: Args).apply(checkConsistency _) ::
(parseTemplate("Suc") :: Args).apply(checkConsistency _) :: Args)
.apply(checkConformance _)
с некоторыми unfornate ограничениями, что каждая функция должна возвращать свой эквивалент либо и что тип ошибки прикладной функции должен быть подтипом аргументов 'тип ошибки. Я сделал это, используя HList, класс приложений и класс-оболочку Successful/UnsuccessfulArgList.
Спасибо. Однако это кажется довольно жестким. синтаксический разбор может также не сгенерировать шаблон вообще. Ваше решение кажется связанным только с одним типом и его преобразованиями. Смотрите мое редактирование выше для того, на что я надеялся. –
Теперь выглядит намного лучше, спасибо вам тоже за вопрос – idonnie