为什么不验证Monad? (scalaz7)
发布时间:2020-12-16 09:45:31 所属栏目:安全 来源:网络整理
导读:示例用例: 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.Validation [String,Int]转换为
示例用例:
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.Validation [String,Int]转换为类型为类型的类型构造函数M [_],类型为scalaz.Bind 我猜这个错误是由编译器造成的,找不到一个Monad实例的验证[String,Int] 我可以为自己做一个,像: 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 } } 但为什么没有验证呢?毕竟,验证已经定义了bind方法。 此外,我不能导入Validation._并导入Instances._一起(这让我无聊找出…),因为另一个复杂的错误… 我应该修改scalaz的来源吗?或者我完全缺少一些东西?? 我正在使用scalaz 7.0.0-M2 解决方法
作为Scalaz组中的
discussed,问题似乎是ap会累积错误,而(伪)单体组合只会在验证的值部分运行。
因此,不能用另一个来表达,因此没有一个monad实例用于验证。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |