【发布时间】:2015-06-02 00:25:00
【问题描述】:
这是我之前question的后续行动
假设我有两个验证函数,如果输入有效则返回输入,否则返回错误消息。
type Status[A] = ValidationNel[String, A]
val isPositive: Int => Status[Int] =
x => if (x > 0) x.success else s"$x not positive".failureNel
val isEven: Int => Status[Int] =
x => if (x % 2 == 0) x.success else s"$x not even".failureNel
还假设我需要验证case class X 的实例:
case class X(x1: Int, // should be positive
x2: Int) // should be even
更具体地说,我需要一个函数checkX: X => Status[X]。此外,我想将checkX 写成isPositive 和isEven 的组合。
val checkX: X => Status[X] =
({x => isPositive(x.x1)} |@| {x => isEven(x.x2)}) ((X.apply _).lift[Status])
这有意义吗?
您如何将checkX 写为isPositive 和isEven 的组合?
【问题讨论】:
-
我现在要开始学习单子了,因为你手头有一个单子(教科书的例子)。
-
我对单子有点了解。我认为我在这里不需要单子。你到底是什么单子?
-
Status(Validation) 是一个应用函子,但不是一个单子。 -
@n.m. 非常 简短回答:
Validation不是 monad,因为它在scalaz中以这种方式定义。有关更多详细信息,请参阅例如 stackoverflow.com/questions/12211776/… -
@n.m.
Validation未定义为单子出于某种原因。欢迎您在任何scalaz教程中阅读它或在 SO 上提问。
标签: scala validation scalaz applicative