在學習時Scalaz 6,我正在嘗試編寫返回驗證的類型安全的讀取程序。這裏是我的新類型:如何使用scalaz編寫應用程序的功能
type ValidReader[S,X] = (S) => Validation[NonEmptyList[String],X]
type MapReader[X] = ValidReader[Map[String,String],X]
,我有兩個函數創建地圖閱讀器的整數和字符串(*):
def readInt(k: String): MapReader[Int] = ...
def readString(k: String): MapReader[String] = ...
鑑於以下地圖:
val data = Map("name" -> "Paul", "age" -> "8")
我可以寫兩個閱讀器來檢索姓名和年齡:
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))
它能正常工作,但表情是尷尬與兩個層次的應用建設者。有沒有辦法,讓下面的語法工作?
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] ^
我以後會發佈一個答案,但作爲一個提示,請記住, 'Applicative [G]'和'Applicative [F]'意味着'Applicative [[x] F [G [x]]'。在scalaz 7中,'Applicative#compose'證明了這個事實。首先直接使用類型類,而不是使用'| @''語法。 – retronym 2012-02-23 07:58:38
謝謝,但我仍然不明白,所以我會等待你的回答。請注意,我正在使用scalaz 6(問題已更新)。 – paradigmatic 2012-02-23 08:05:25
@paradigmatic你有沒有試過明確使用'apply'?像'(name | @ | age)應用{Boy(_,_)}'? – 2012-02-23 13:59:01