簡體   English   中英

scalaz 驗證和列表單子

[英]scalaz validation and list monad

我正在嘗試提出類似於以下內容的內容:

val s: Validation[String, Int] = 1.success
def s2(i: Int): Validation[String, Int] = i.success

val result = for {
  i <- s
  j <- List(1, 2)
  k <- s2(j)
} yield "fine";

上面的代碼無法編譯,我理解,在語法上它沒有意義。

我正在嘗試以單子方式執行驗證列表。 我該如何做到這一點?

如果您有A的驗證列表,則可以使用sequence將其轉換為A列表的驗證:

List(1, 2).map(s2).sequence[({type l[a]=Validation[String, a]})#l, Int] 

(如果我正確理解了這個問題)。 所以你得到

val result = for {
  i <- s
  k <- List(1, 2).map(s2).sequence[({type l[a]=Validation[String, a]})#l, Int] 
} yield "fine"

您似乎正在使用驗證來解決副作用。 這不是它的目的。 您在函數式編程中使用返回值。

對於理解的驗證在成功時繼續進行,但在失敗時中斷並返回失敗。

scala> def g(i: Int): Validation[String, Int] = { 
          println(i); if(i % 2 == 0) i.success else "odd".fail 
       }
g: (i: Int)scalaz.Validation[String,Int]

scala> val result = for {
     |   i <- g(1)
     |   j <- g(2)
     | } yield (i,j)
1
result: scalaz.Validation[String,(Int, Int)] = Failure(odd)

scala> val result = for {
     |   i <- g(2)
     |   j <- g(1)
     | } yield (i,j)
2
1
result: scalaz.Validation[String,(Int, Int)] = Failure(odd)


scala> val result = for {
     |   i <- g(2)
     |   j <- g(2)
     | } yield (i,j)
2
2
result: scalaz.Validation[String,(Int, Int)] = Success((2,2))


scala> val result = for {
     |   i <- g(1)
     |   j <- g(1)
     | } yield (i,j)
1
result: scalaz.Validation[String,(Int, Int)] = Failure(odd)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM