Xia*_*ong 4 validation scala scalaz
我有scalaz验证的这个实现,似乎隐含scalaz.Bind不在范围内,所以表达式不起作用.这是代码:
import scalaz._
import Scalaz._
case class User(name: String, knowScala: Boolean, age: Int)
object PublicValidationSpec extends BasicValidation {
def validate(user: User): Validation[String, String] = {
for {
b <- checkAge(user)
c <- checkName(user)
} yield s"Congrats, ${c.name}"
}
}
trait BasicValidation {
def checkName(user: User): Validation[String, User] = {
if(user.name == "") "must have a name".fail else user.success
}
def checkAge(user: User): Validation[String, User] = {
if(user.age < 3) "must be a valid age".fail else user.success
}
}
Run Code Online (Sandbox Code Playgroud)
例外是
Error:(14, 25) Implicit not found: scalaz.Unapply[scalaz.Bind,
scalaz.Validation[String,scalaz.validation.User]]. Unable to unapply type
`scalaz.Validation[String,scalaz.validation.User]` into a type constructor of
kind `M[_]` that is classified by the type class `scalaz.Bind`. Check that the
type class is defined by compiling `implicitly[scalaz.Bind[type constructor]]` and
review the implicits in object Unapply, which only cover common type 'shapes.'
b <- checkAge(user)
Did i miss some implicit imports here ?
^
Run Code Online (Sandbox Code Playgroud)
验证没有为其定义Bind.
在Scalaz 7.1.0-M5(M6太)Validation.flatMap
已被弃用,在颠覆警告的尝试,它看起来像的优先级flatMap
正在失去scalaz.syntax.bind._
,这是部分Scalaz._
进口.请参阅此提交https://github.com/scalaz/scalaz/commit/2727b2451eba2aa159f3fbb62bf92790ac99dc7a.尝试添加import scalaz.Validation.FlatMap._
或仅导入您需要的东西,例如
import scalaz.Validation
import scalaz.syntax.validation._
Run Code Online (Sandbox Code Playgroud)
我建议使用除此之外的东西Validation
,因为这可能只会在将来引起更多问题.见scalaz.\/
下文.
这可以使用scalaz 7.0.5进行编译.Validation.flatMap
在7.0.6中定义,因此它也应该使用该版本进行编译.我不会在新代码中使用此功能(Validation
在for
理解中).
scalaz的权力在Validation.flatMap
一段时间以来一直在贬低.flatMap
是什么让它在for
理解中工作.flatMap
是在工作分支虽然弃用.这有很长的背景.请参阅https://groups.google.com/forum/#!topic/scalaz/Wnkdyhebo2w.
TLDR - 验证不是monad.任何可能的实现Validation.flatMap
都不会与Apply
定义的行为相匹配Validation
.
scalaz.\/
如果你想在for
理解中使用某些东西,请使用(也称为析取).如果需要累积错误,请使用Validation
over \/
,convert to Validation
然后返回的原因\/
.
归档时间: |
|
查看次数: |
590 次 |
最近记录: |