ile uygulamalara işlevler nasıl oluşturulur Scalaz 6'u öğrenirken, doğrulamaya geri dönen türlerde güvenli okuyucular yazmaya çalışıyorum.Scalaz
type ValidReader[S,X] = (S) => Validation[NonEmptyList[String],X]
type MapReader[X] = ValidReader[Map[String,String],X]
ve iki ints ve dizeleri için harita-okuyucuları oluştururken fonksiyonları (*) var: İşte benim yeni türleridir
def readInt(k: String): MapReader[Int] = ...
def readString(k: String): MapReader[String] = ...
aşağıdaki haritası Verilen:
val data = Map("name" -> "Paul", "age" -> "8")
ben adı ve yaşı almak için iki okuyucu yazabilir:
val name = readString("name")
val age = readInt("age")
println(name(data)) //=> Success("Paul")
println(age(data)) //=> Success(8)
Her şey çalışıyor, ama şimdi bir Boy
örneği oluşturmak için hem okuyucuları oluşturmak istiyorum:
case class Boy(name: String, age: Int)
En iyi almaktır: Bu beklenen işleri olarak
val boy = (name |@| age) {
(n,a) => (n |@| a) { Boy(_,_) }
}
println(boy(data)) //=> Success(Boy(Paul,8))
ama ifadesi ile garip iki seviyeli uygulama kurucuları. Aşağıdaki sözdizimini çalışmak için bir yol var mı?
val boy = (name |@| age) { Boy(_,_) }
(*) Tam ve katedilebilen uygulanması: https://gist.github.com/1891147
Güncelleme: İşte üstünde veya Daniel öneri hattını çalışırken alıyorum derleyici hata iletisi:
[error] ***/MapReader.scala:114: type mismatch;
[error] found : scalaz.Validation[scalaz.NonEmptyList[String],String]
[error] required: String
[error] val boy = (name |@| age) { Boy(_,_) }
[error] ^
ama bir ipucu olarak, unutmayın “Uygulayıcı [G] ve“ Uygulayıcı [F] ”,“ Uygulayıcı [[x] F [G [x]] ”anlamına gelir. Scalaz 7'de, “Uygulayıcı # kompozisyon” bu gerçeğe tanıklık ediyor. '| @ |' Sözdizimini kullanmak yerine, doğrudan başlamak için tip sınıflarıyla çalışın. – retronym
Teşekkürler, ama hala anlamadım, bu yüzden cevabınızı bekleyeceğim. Scalaz 6 kullanıyorum (soru güncellendi). – paradigmatic
@paradigmatic "apply" ı kullanmayı açıkça denediniz mi?(Isim | @ | yaş) gibi {Boy (_, _)} 'gibi? –