编写Scalaz 7验证

编写Scalaz 7验证,scala,scalaz,Scala,Scalaz,我想编写返回Scalaz 7Validations的检查。我做了一个简单的例子,解析一系列单词并从中构造Person对象。解析可能在许多步骤中失败,在这种情况下,我们失败得很快,错误消息是失败的原因。下面的例子完全是捏造出来的,虽然很愚蠢,但它尽可能接近我想要实现的目标 看看我下面的理解,似乎有更好的方法来编写验证 初始顺序更改了几次,从seq到seq2再到seq3。例如调用lastnamevalization时,需要使用seq2显式调用它,即使它在seq2=onlyShort(seq)之后调用

我想编写返回Scalaz 7
Validation
s的检查。我做了一个简单的例子,解析一系列单词并从中构造Person对象。解析可能在许多步骤中失败,在这种情况下,我们失败得很快,错误消息是失败的原因。下面的例子完全是捏造出来的,虽然很愚蠢,但它尽可能接近我想要实现的目标

看看我下面的理解,似乎有更好的方法来编写验证

  • 初始顺序更改了几次,从
    seq
    seq2
    再到
    seq3
    。例如调用
    lastnamevalization
    时,需要使用
    seq2
    显式调用它,即使它在
    seq2=onlyShort(seq)
    之后调用
  • 我读过关于克莱斯利箭头组合的书,当人们可以组合
    A=>M[B]
    B=>M[C]
    得到一个箭头
    A=>M[C]
    (其中
    M
    是单子)。然而,我在这里并不总是以这样一种方式编写东西,即下一步将重用上一步的计算。我无法让克莱斯利·阿罗用Scalaz 7创作作品 代码:

    导入scalaz.\uz,scalaz_
    案例类别地址(streetName:String,streetNumber:Int)
    案例类人员(姓名:String,姓氏:String,年龄:Int,地址:address)
    def namevalization(seq:List[String])=seq.find(Set(“John”、“Carol”、“Susan”)。contains())。toSuccess(“未找到名称”)
    def lastNameValidation(seq:List[String])=seq.find(Set(“Kennedy”、“Hardy”、“Taplin”)。包含()).toSuccess(“未找到姓氏”)
    def lengthValidation(lastName:String)=lastName.size.success[String]
    def dyValidation(lastName:String)=如果(!lastName.contains(“dy”))失败(“非此人”)否则成功(123)
    def streetNumberValidation(seq:List[String])=seq.find(u.forall(u.isDigit)).map(u.toInt).toSuccess(“无法提取街道号”)
    def streetValidation(seq:List[String])=seq.find(Set(“布什街”、“松树街”、“市场街”)。包含()).toSuccess(“未找到街道”)
    def onlyShort(seq:List[String])=seq.filter(u.size<15)
    def omit垃圾(seq:List[String])=seq.filter(!=“垃圾”)
    def createPerson(seq:List[String])=for{
    
    列出两条快速注释。首先,如果您不想累积失败,请使用
    \/
    (或者使用普通的
    )第二,从一大串字符串中挖掘值本质上是混乱的,如果你不能将问题分解成更小的阶段,我想这就和你将要得到的一样清晰了。
    或者
    都不是单子,所以我无法很好地用它来理解(我需要调用
    .right
    以获得正确的投影)默认情况下,
    Validation
    是右倾的,因此可以很好地将其组合在一起以便于理解。另一件事是,交错
    Validation
    也不是单子,关于它是否应该使用
    flatMap
    方法来生成
    for
    理解语法,存在一些争论可能。
    \/
    是一个单子,本质上只是一个右偏的
    ,带有一些方便的附加操作。
    
    import scalaz._, Scalaz._
    
    case class Address(streetName: String, streetNumber: Int)
    case class Person(name: String, lastName: String, age: Int, address: Address)
    
    def nameValidation(seq: List[String]) = seq.find(Set("John", "Carol", "Susan").contains(_)).toSuccess("Name not found")
    def lastNameValidation(seq: List[String]) = seq.find(Set("Kennedy", "Hardy", "Taplin").contains(_)).toSuccess("Last name not found")
    def lengthValidation(lastName: String) = lastName.size.success[String]
    def dyValidation(lastName: String) = if (!lastName.contains("dy")) Failure("Not the person") else Success(123)
    def streetNumberValidation(seq: List[String]) = seq.find(_.forall(_.isDigit)).map(_.toInt).toSuccess("Could not extract street number")
    def streetValidation(seq: List[String]) = seq.find(Set("Bush Street", "Pine Street", "Market Street").contains(_)).toSuccess("Street not found")
    
    def onlyShort(seq: List[String]) = seq.filter(_.size < 15)
    def omitGarbage(seq: List[String]) = seq.filter(_ != "garbage")
    
    def createPerson(seq: List[String]) = for {
      name <- nameValidation(seq)
      seq2 = onlyShort(seq)
      lastName <- lastNameValidation(seq2)
      length <- lengthValidation(lastName)
      dy <- dyValidation(lastName)
      seq3 = omitGarbage(seq2)
      streetNumber <- streetNumberValidation(seq3)
      street <- streetValidation(seq3)
    } yield Person(name, lastName, 80, Address(street, streetNumber))
    
    createPerson(List("255", "a very long string", "Bush Street", "Hardy", "San Francisco", "John", "garbage"))
    
    createPerson(List("a very long string", "Bush Street", "Hardy", "San Francisco", "John", "garbage"))
    
    scala> import scalaz._, Scalaz._
    import scalaz._
    import Scalaz._
    
    scala> case class Address(streetName: String, streetNumber: Int)
    defined class Address
    
    scala> case class Person(name: String, lastName: String, age: Int, address: Address)
    defined class Person
    
    scala> def nameValidation(seq: List[String]) = seq.find(Set("John", "Carol", "Susan").contains(_)).toSuccess("Name not found")
    nameValidation: (seq: List[String])scalaz.Validation[java.lang.String,String]
    
    scala> def lastNameValidation(seq: List[String]) = seq.find(Set("Kennedy", "Hardy", "Taplin").contains(_)).toSuccess("Last name not found")
    lastNameValidation: (seq: List[String])scalaz.Validation[java.lang.String,String]
    
    scala> def lengthValidation(lastName: String) = lastName.size.success[String]
    lengthValidation: (lastName: String)scalaz.Validation[String,Int]
    
    scala> def dyValidation(lastName: String) = if (!lastName.contains("dy")) Failure("Not the person") else Success(123)
    dyValidation: (lastName: String)Product with Serializable with scalaz.Validation[java.lang.String,Int]
    
    scala> def streetNumberValidation(seq: List[String]) = seq.find(_.forall(_.isDigit)).map(_.toInt).toSuccess("Could not extract street number")
    streetNumberValidation: (seq: List[String])scalaz.Validation[java.lang.String,Int]
    
    scala> def streetValidation(seq: List[String]) = seq.find(Set("Bush Street", "Pine Street", "Market Street").contains(_)).toSuccess("Street not found")
    streetValidation: (seq: List[String])scalaz.Validation[java.lang.String,String]
    
    scala> def onlyShort(seq: List[String]) = seq.filter(_.size < 15)
    onlyShort: (seq: List[String])List[String]
    
    scala> def omitGarbage(seq: List[String]) = seq.filter(_ != "garbage")
    omitGarbage: (seq: List[String])List[String]
    
    scala> def createPerson(seq: List[String]) = for {
         |   name <- nameValidation(seq)
         |   seq2 = onlyShort(seq)
         |   lastName <- lastNameValidation(seq2)
         |   length <- lengthValidation(lastName)
         |   dy <- dyValidation(lastName)
         |   seq3 = omitGarbage(seq2)
         |   streetNumber <- streetNumberValidation(seq3)
         |   street <- streetValidation(seq3)
         | } yield Person(name, lastName, 80, Address(street, streetNumber))
    createPerson: (seq: List[String])scalaz.Validation[java.lang.String,Person]
    
    scala> createPerson(List("255", "a very long string", "Bush Street", "Hardy", "San Francisco", "John", "garbage"))
    res19: scalaz.Validation[java.lang.String,Person] = Success(Person(John,Hardy,80,Address(Bush Street,255)))
    
    scala> createPerson(List("a very long string", "Bush Street", "Hardy", "San Francisco", "John", "garbage"))
    res20: scalaz.Validation[java.lang.String,Person] = Failure(Could not extract street number)