当前位置: 首页 > 知识库问答 >
问题:

为什么验证不是一个Monad?

翟志新
2023-03-14

一个示例用例:

def div2(i: Int): Validation[String, Int] = 
    if (i%2 == 0) Validation.success(i/2)
    else Validation.failure("odd")

def div4(i: Int) = for {
    a <- div2(i)
    b <- div2(a)
} yield b

错误:无法取消应用scalaz的类型。将[String,Int]验证为类型为M[_]的类型构造函数,该类型构造函数由类型类scalaz.Bind进行分类

我猜错误是由于编译器找不到用于验证[String, Int]Monad实例造成的

我可以为自己做一个,比如:

object Instances {
implicit def validationMonad[E] = new Monad[({type L[A] = Validation[E, A]})#L] {
    override def point[A](a: => A) =
        Validation.success(a)
    override def bind[A, B](fa: Validation[E, A])(f: A => Validation[E, B]) =
        fa bind f
}
}

但是为什么验证还没有呢?毕竟,验证已经定义绑定方法。

此外,我不能有导入验证。_导入实例。_在一起了(这花了我很长时间才弄清楚...),因为另一个复杂的错误...
模糊的隐式值:类似于validationMonad(我的实例)和traitValidationInstances2中的方法ValidationInstances1...两者都匹配一些验证函数...

我应该修改scaraz的源代码吗?或者我完全错过了什么~?
请帮忙~

我用的是scalaz 7.0.0-M2

共有2个答案

桑璞
2023-03-14

问题在于 monad 所隐含的应用函子不等于实际的应用函子

彭胡媚
2023-03-14

正如Scalaz小组中所讨论的,问题似乎是< code>ap会累积错误,而(伪)一元合成只会对< code>Validation的值部分进行操作。

因此,一个不能用另一个来表示,因此验证不存在monad实例。

 类似资料:
  • 问题内容: 从JavaDoc: 验证此容器及其所有子组件。验证容器意味着布置其子组件。 那就是我想做的。使用尽可能轻巧的组件。但是当我这样做时,对的调用不会使组件“有效”。 为什么我不能做一个有效的? 问题答案: 在文档中说: 当组件在其父容器中的大小和位置正确且其所有子组件也均有效时,该组件才有效。 这种情况,直到你达到顶级容器(,或)。在您所遇到的问题的示例中,您没有父母,所以它永远不会有效。

  • 我想验证字段,如果存在,将失败,如果另一个字段不存在如何做到这一点?我已经创建了自定义验证,以获得基于存储ID的记录 我有字段和,并且字段根据在最大值和最小值之间进行验证,如果我显示=且未填写字段,则验证字段将通过,并显示错误,因为我未填写我希望在执行自定义验证之前检查是否为空。。 我已经阅读了laravel文档上的所有验证方法,但仍然没有找到解决方案。怎么做?

  • 我试图理解为什么JWT认证是无状态的。在有状态认证中,会有一个会话id。这里有一张JWT的代币,上面有签名。所以身份验证服务器发布JWT令牌,但是我可以说后续请求中JWT令牌的验证是由endpoint服务器(应用服务器)而不是身份验证服务器来完成的吗?我相信这是可能的,因为JWT是用截止日期(还有一些其他信息)签名的,并且认证服务器的公共证书对所有endpoint服务器都是可用的。 因此,认证服务

  • 我试图将Auth0整合到我的web应用程序用户登录中。但是,我总是得到“无效的验证码格式。”。 我注意到 Auth0Lock 提供的验证码是 ,而直接 GET 返回的验证码要大得多 。 问题是:有了Auth0,我应该如何使用校验码来换取access_token。

  • 我知道容器可以有其他参数,如填充或装饰,但如果我不使用这些,为什么我要使用SizedBox而不是容器? 它们之间存在性能差异?

  • 问题内容: 有没有一种方法可以使用此处定义的注释来定义Hibernate验证规则,说明至少一个字段不能为null? 这将是一个假设的示例(实际上不存在): 在所示的情况下,fieldA可以为null或fieldB可以为null,但不能同时为两者。 一种方法是创建自己的验证器,但是我想避免它已经存在。如果您已经验证过,请分享一个验证人…谢谢! 问题答案: 我终于写了整个验证器: 用法示例: