質問

学習中 Scalaz 6, 、私は検証を返しているタイプセーフ読者を書き込もうとしています。これが私の新しいタイプです:

type ValidReader[S,X] = (S) => Validation[NonEmptyList[String],X]
type MapReader[X] = ValidReader[Map[String,String],X]

また、INTと文字列のマップリーダーを作成する2つの関数(*)があります。

def readInt( k: String ): MapReader[Int] = ...
def readString( k: String ): MapReader[String] = ...

次のマップが与えられます:

val data = Map( "name" -> "Paul", "age" -> "8" )

名前と年齢を取得するために2人の読者を書くことができます。

val name = readString( "name" )
val age = readInt( "age" )

println( name(data) ) //=> Success("Paul")
println( age(data) )  //=> Success(8)

すべてが正常に機能しますが、今は両方の読者に構成して構築したい Boy 実例:

case class Boy( name: String, age: Int )

私の最高のテイクは:

  val boy = ( name |@| age ) {
    (n,a) => ( n |@| a ) { Boy(_,_) }
  }
  println( boy(data) ) //=> Success(Boy(Paul,8))

予想通りに機能しますが、2つのレベルのアプリケーションビルダーで表現は厄介です。次の構文を機能させる方法はありますか?

  val boy = ( name |@| age ) { Boy(_,_) }

(*)完全で実行可能な実装: https://gist.github.com/1891147


アップデート: 上記の行またはダニエルの提案を試したときに得られるコンパイラエラーメッセージは次のとおりです。

[error] ***/MapReader.scala:114: type mismatch;
[error]  found   : scalaz.Validation[scalaz.NonEmptyList[String],String]
[error]  required: String
[error]   val boy = ( name |@| age ) { Boy(_,_) }
[error]                                    ^

正しい解決策はありません

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top