gpt4 book ai didi

validation - 如何使用 scalaz 为应用程序编写函数

转载 作者:行者123 更新时间:2023-12-04 02:17:40 26 4
gpt4 key购买 nike

一边学习 Scalaz 6 ,我正在尝试编写返回验证的类型安全读取器。这是我的新类型:

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

我有两个函数为整数和字符串(*)创建 map 阅读器:
def readInt( k: String ): MapReader[Int] = ...
def readString( k: String ): MapReader[String] = ...

鉴于以下 map :
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

更新:这是我在尝试上面的行或 Daniel 建议时收到的编译器错误消息:
[error] ***/MapReader.scala:114: type mismatch;
[error] found : scalaz.Validation[scalaz.NonEmptyList[String],String]
[error] required: String
[error] val boy = ( name |@| age ) { Boy(_,_) }
[error] ^

最佳答案

这个怎么样?

val boy = (name |@| age) {
(Boy.apply _).lift[({type V[X]=ValidationNEL[String,X]})#V]
}

或使用类型别名:
type VNELStr[X] = ValidationNEL[String,X]

val boy = (name |@| age) apply (Boy(_, _)).lift[VNELStr]

这是基于控制台上的以下错误消息:
scala> name |@| age apply Boy.apply
<console>:22: error: type mismatch;
found : (String, Int) => MapReader.Boy
required: (scalaz.Validation[scalaz.NonEmptyList[String],String],
scalaz.Validation[scalaz.NonEmptyList[String],Int]) => ?

所以我刚刚解除了 Boy.apply采取所需的类型。

关于validation - 如何使用 scalaz 为应用程序编写函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9408523/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com