【发布时间】:2015-05-29 10:54:53
【问题描述】:
假设我需要编写一个验证函数Validate[A]:
type Status[A] = Validation[List[String], A]
type Validate[A] = A => Status[A] // should be Kleisli
如果输入有效,则该函数返回带有输入的Success;如果输入无效,则返回带有错误列表的Failure。
例如,
val isPositive: Validate[Int] = {x: Int =>
if (x > 0) x.success else List(s"$x is not positive").failure
}
val isEven: Validate[Int] = {x: Int =>
if (x % 2 == 0) x.success else List(s"$x is not even").failure
}
由于Validation 是半群Validate 也是半群并且(如果我将其定义为Kleisli)我可以编写 验证函数如下:
val isEvenPositive = isEven |+| isPositive
现在假设我需要验证X:
case class X(x1: Int, // should be positive
x2: Int) // should be even
因为Validation 是一个应用函子Validate 也是一个应用函子。
val x: Validate[X] = (isPositive |@| isEven)(X.apply)
有意义吗?
【问题讨论】:
-
验证只形成一个半群,其中左右都形成半群
-
感谢提醒。我认为
Validation[E, A]要求E是一个半群,但它可能不是。 -
它需要
E: Semigroup来形成一个应用程序,它需要E: Semigroup, A: Semigroup来形成一个半群。见ValidationInstances -
不是重复的,但有些相关,可能会导致不同的方法:meta.plasm.us/posts/2013/06/05/applicative-validation-syntax
标签: scala validation scalaz