如何实现 Scalaz Applicative?
How to implement a Scalaz Applicative?
我的客户类型 QueryResult
是
type QueryResult[A] = A org.scalactic.Or One[Error]
在执行多个查询时,我得到一个 List[QueryResult[A]]
,但我想要一个 QueryResult[List[A]]
。
我可以为 List
实现一个 sequence
方法,但我想要一个更通用的方法,所以我尝试用 Scalaz 创建一个。
def sequence2[A, T[_]: Traverse](traversable: T[QueryResult[A]])
(implicit app: Applicative[QueryResult]): QueryResult[T[A]] = {
app.sequence(traversable)
}
这似乎可行,但无法编译,因为 Applicative[QueryResult]
.
没有隐式参数 app
如何创建一个?
或者 Scalaz 能否以某种方式 'magically' 生成一个?
这应该有效:
import scalaz.Applicative
implicit val queryApplicative: Applicative[QueryResult] =
new Applicative[QueryResult] {
def point[A](a: => A): QueryResult[A] = Good(a)
def ap[A, B](fa: => QueryResult[A])(f: => QueryResult[A => B]): QueryResult[B] =
f.flatMap(ff => fa.map(ff))
}
我也不认为你需要自己定义sequence2
,你应该可以做到:
import scalaz.std.list._
import scalaz.syntax.traverse._
List(1.point[QueryResult], 2.point[QueryResult]).sequence
我的客户类型 QueryResult
是
type QueryResult[A] = A org.scalactic.Or One[Error]
在执行多个查询时,我得到一个 List[QueryResult[A]]
,但我想要一个 QueryResult[List[A]]
。
我可以为 List
实现一个 sequence
方法,但我想要一个更通用的方法,所以我尝试用 Scalaz 创建一个。
def sequence2[A, T[_]: Traverse](traversable: T[QueryResult[A]])
(implicit app: Applicative[QueryResult]): QueryResult[T[A]] = {
app.sequence(traversable)
}
这似乎可行,但无法编译,因为 Applicative[QueryResult]
.
app
如何创建一个? 或者 Scalaz 能否以某种方式 'magically' 生成一个?
这应该有效:
import scalaz.Applicative
implicit val queryApplicative: Applicative[QueryResult] =
new Applicative[QueryResult] {
def point[A](a: => A): QueryResult[A] = Good(a)
def ap[A, B](fa: => QueryResult[A])(f: => QueryResult[A => B]): QueryResult[B] =
f.flatMap(ff => fa.map(ff))
}
我也不认为你需要自己定义sequence2
,你应该可以做到:
import scalaz.std.list._
import scalaz.syntax.traverse._
List(1.point[QueryResult], 2.point[QueryResult]).sequence