2016-09-13 10 views
3

これはscalaz 7.0.6で動作しますが、最新リリースのscalaz 7.2.6では動作しません。scalaz 7.2.6 flatMapはバリデーションの方法ではありませんか?

import scalaz._, Scalaz._ 

def allDigits(s: String): Validation[String, String] = 
    if (s.forall(_.isDigit)) s.success else "Not all digits".failure 

def maxSizeOfTen(s: String): Validation[String, String] = 
    if (s.length <= 10) s.success else "Too big".failure 

def toInt(s: String) = try s.toInt.success catch { 
    case _: NumberFormatException => "Still not an integer".failure 
} 

val validated1 = for { 
    x <- allDigits("4234") 
    y <- maxSizeOfTen(x) 
    z <- toInt(y) 
} yield z 

私はscalaz 7.2.6でこれらのエラーを取得:

value flatMap is not a member of scalaz.Validation[String,String] 
     x <- allDigits("4234") 
value flatMap is not a member of scalaz.Validation[String,String] 
     y <- maxSizeOfTen(x) 
... 

は、どのように私はそれがscalazの最新バージョンで動作するのですか?


更新:受け入れ答えに基づくソリューション:それは障害を蓄積することを目的とは無関係のためApplicativeインスタンスを持っているので

import scalaz._, Scalaz._ 

def allDigits(s: String): \/[String, String] = 
    if (s.forall(_.isDigit)) s.right else "Not all digits".left 

def maxSizeOfTen(s: String): \/[String, String] = 
    if (s.length <= 10) s.right else "Too big".left 

def toInt(s: String) = try s.toInt.right catch { 
    case _: NumberFormatException => "Still not an integer".left 
} 

val validated1 = for { 
    x <- allDigits("4234") 
    y <- maxSizeOfTen(x) 
    z <- toInt(y) 
} yield z 

答えて

4

検証は、flatMapで使用することを想定していません(コンテキストフリー)計算あなたのケースでは\/が使用されています(依存(またはコンテキスト依存)計算)。 このインポートを追加することで、必要なものを達成することができます。 import Validation.FlatMap._

関連する問題