加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

将验证与scalaz 7相结合

发布时间:2020-12-16 19:16:49 所属栏目:安全 来源:网络整理
导读:鉴于以下功能: def foo( a: A ): ValidationNEL[String,Seq[B]] = ...def bar( b: B ): ValidationNEL[String,C] = ... 我想将它们组合起来构建一个函数,调用foo然后最终调用生成的Seq中的每个元素上的bar,这样得到一个ValidationNEL [String,Seq [C]]: de
鉴于以下功能:

def foo( a: A ): ValidationNEL[String,Seq[B]] = ...

def bar( b: B ): ValidationNEL[String,C] = ...

我想将它们组合起来构建一个函数,调用foo然后最终调用生成的Seq中的每个元素上的bar,这样得到一个ValidationNEL [String,Seq [C]]:

def fooAndBar( a: A ): ValidationNEL[String,Seq[C]]

Scalaz 7中的文档很短,我找不到任何相关的例子.

解决方法

在B序列上进行硬核遍历.请注意,我在这里使用了List,因为Scalaz 7似乎没有Seq的类型类实例,但是如果确实需要的话,编写自己的实例应该不会太难.

import scalaz.{ValidationNEL,Traverse,NonEmptyList}
import scalaz.std.list.listInstance
case class A(a: Int)
case class B(b: Int)
case class C(c: Int)

def foo( a: A ): ValidationNEL[String,List[B]] = Validation.success(List(B(1),B(2)))
def bar( b: B ): ValidationNEL[String,C] = Validation.failure(NonEmptyList("error in " + b.b))//Validation.success(C(b.b * 2))

type ValNEL[A] = ValidationNEL[String,A]

def foobar(a: A): ValidationNEL[String,List[C]] =
  foo(a) flatMap { bs =>
    Traverse[List].traverse[ValNEL,B,C](bs)(bar)
  }

val r: scalaz.ValidationNEL[String,List[C]] = foobar(A(3))

更新:另请参阅无价的Haskellwiki Typeclassopedia

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读