【发布时间】:2017-08-30 02:54:07
【问题描述】:
这是我之前的question 的后续。
假设我需要编写一个函数validate 以确保给定的字符串列表由“a”、“b”和一个或多个“c”组成。
def validate(ss: List[String]): Either[NonEmptyList[MyError], Unit] = ???
假设我有三个函数来检查给定的字符串是“a”、“b”还是“c”:
def validateA(str: String): Either[MyError, Unit] = ???
def validateB(str: String): Either[MyError, Unit] = ???
def validateC(str: String): Either[MyError, Unit] = ???
如何组合这些函数来实现validate?
一种解决方案是“解析器组合器”方法。为 Validator = Either[NonEmptyList[MyError], List[String]] 类型定义一个 monad 实例,像 oneOrMore 这样的组合器类似于解析器组合器等。
我想知道是否有更简单的解决方案。
【问题讨论】:
-
它们是否已排序?您可以依靠职位来进行验证吗? (例如,第一个必须是
a,第二个必须是b,然后是一个或多个c) -
可以使用 ADT 代替
Unit吗?为您的问题提供一个提示,使用函数orElse。
标签: scala validation monads parser-combinators scala-cats