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