问题标签 [scalaz7]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
370 浏览

api - 编写处理异常的 Scala 方法签名的最佳方法

为了在 Scala 中处理异常,我更喜欢避免基本的try/catch并从 Scalaz 的函数式思维中受益(在某些情况下Validation类似于类型)。Either

我的应用程序公开了一些服务。想象一下我的服务层中的这种方法(没有真正意义,但对概念有好处)。如果所有规则都成功通过,它将Buyer(购买者)与他的新关联Car并返回包含此关联:Car

说明:创建 aCar可能会导致两种异常类型之一:

  • Throwable包装异常的技术故障(例如,当数据库崩溃时) 。
  • 业务失败(防止不一致的自定义应用程序规则,例如,Car具有非法状态)。CarCreationFailure是一个,当然可以通过更多的precised失败来扩展。

我的问题特别关注客户端,并专门处理不止一种潜力Business Failure

是否应该将返回类型Validation[Either[TechnicalFailure, List[CarCreationFailure]], CarDTO]替换为不那么繁琐的:ValidationNel[Throwable, CarDTO]

请注意此处ValidationNel(将错误/异常累积到 a 中NonEmptyList)。

缺点是新读者乍一看无法猜测此方法返回TechnicalFailureCarCreationFailureBusinessFailureso 的子类);只是一个太可怕了Throwable

他将被迫对Throwable我的应用程序中包含的每种类型应用模式匹配,以确保不会忘记任何人... => 混乱。

这些解决方案中最干净的方法是什么,或者可能是……另一种?

0 投票
3 回答
712 浏览

scala - Scalaz 7 Iteratee 处理大型 zip 文件 (OutOfMemoryError)

我正在尝试使用 scalaz iteratee 包来处理恒定空间中的大型 zip 文件。我需要对 zip 文件中的每个文件执行一个长时间运行的过程。这些过程可以(并且应该)并行运行。

我创建了一个EnumeratorT将每个膨胀ZipEntry成一个File对象。签名看起来像:

我想附加一个IterateeT将对每个文件执行长时间运行的过程。我基本上得到了类似的东西:

当我尝试运行它时:

我收到一条java.lang.OutOfMemoryError: Java heap space消息。这对我来说很有意义,因为它试图建立一个庞大的列表来存储所有这些IOPromise对象。

几个问题:

  • 有人对如何避免这种情况有任何想法吗?感觉就像我错误地解决了这个问题,因为我真的只关心longRunningProcess它的副作用。
  • 这里的Enumerator方法是错误的方法吗?

我几乎没有想法,所以任何事情都会有所帮助。

谢谢!

更新#1

这是堆栈跟踪:

我目前正在接受 nadavwr 的建议,以确保一切都像我想的那样。我会报告任何更新。

更新#2

使用以下两个答案的想法,我找到了一个不错的解决方案。正如 huynhjl 建议的那样(我使用 nadavwr 的分析堆转储的建议进行了验证),consume导致每个膨胀ZipEntry都保存在内存中,这就是进程内存不足的原因。我更改consumefoldM更新了长时间运行的过程,只返回 aPromise[IOE[Unit]]而不是对文件的引用。这样我最后就有了所有 IoExceptions 的集合。这是工作解决方案:

此解决方案会在异步上传每个条目时对它们进行膨胀。Promise最后,我有一个包含任何错误的已完成对象的巨大列表。我仍然不完全相信这是对 Iteratee 的正确使用,但我现在确实有几个可重用、可组合的部分,可以在我们系统的其他部分中使用(这对我们来说是一种非常常见的模式)。

感谢你的帮助!

0 投票
1 回答
459 浏览

scala - 为什么 scalaz 的 Monoid for Option 实现会两次评估 f2 函数?

scalaz的option monoid定义如下:

f2是按名称传递的参数,这意味着每次调用都会评估表达式。刚刚在模式匹配中求值的时候,为什么还要再求值呢?返回Some(a2)应该是相同的结果,并且表达式f2可能非常昂贵。

我错过了什么吗?

Scalaz 的 Option.scala 源码

0 投票
1 回答
712 浏览

validation - 使用 Scalaz 7 在 Scala 中验证类的内聚方式

我的目标是在创建一个有效实例之前验证'方法User中的字段:objectapplyUser

我选择使用Validationfrom Scalaz7来积累潜在的非法参数/错误。

以下代码中的一个缺点是 Scalaz7 API 强制我让验证器自己创建实例。但是,通过遵循单一责任原则,这显然不是它的作用。它的作用只是验证字段并返回一些错误列表。

让我们首先展示我的实际代码(作为参考,Empty****对象只是一些case object扩展UserCreationFailure):

我所期望的只是返回这个片段代码:

并将适当的结果带入我的User班级,允许通过执行以下操作创建有效的实例:

事实上,它对 SRP 会更友好。

(checkForUserName ⊛ checkForPassword)返回一个完全private类型的类型:

private[scalaz] trait ApplicativeBuilder[M[_], A, B],

因此我不知道class返回的类型。

因此,我被迫直接将用户的创建与它相关联。

我怎样才能保留 SRP 并保留此验证机制?

-----更新----

class正如@Travis Brown 所提到的,为我使用外部设备的意图UserValidator可能看起来很奇怪。实际上,我希望验证器是可模拟的,因此,我不得不在trait/上使用组合abstract class

0 投票
1 回答
407 浏览

scala - 如何在scalaz 7中使用变压器在monad堆栈之间进行转换

我正在努力理解 monad 堆栈和 monad 转换器Scalaz7。我觉得我已经非常接近答案了,但只是无法理解特定的步骤。

以下代码在磁盘上查找ffmpeg二进制文件,然后创建要运行的可执行命令,然后执行该命令,然后对输出进行一些琐碎的操作。

代码通过运行开始

此代码有效,但您会注意到callFfmpeg's 类型签名IO[Option[Stream[String]]]而不是IO[Stream[String]]. 我不得不将它更改为它以使其进行类型检查,但实际上因为所有callFfmpeg的只是调用执行一个返回Stream它的类型签名应该是的进程IO[Stream[String]]

我的问题是,鉴于在我打电话时callFfmpeg我正在处理IO[Option[String]]如何到达IO[Option[Stream[String]]]

0 投票
3 回答
205 浏览

scala - 如何将 F[A \/ B] 拆分为 (F[A], F[B])

我偶尔会遇到这样的代码:

或者在我目前的情况下,我想要Map[A, B \/ C] => (Map[A, B], Map[A, C])

F[A \/ B]在对 F 进行适当限制的一般情况下,有没有一种很好的方法可以做到这一点?它看起来隐约像是 Unzip 主题的变体。

0 投票
1 回答
291 浏览

scala - 设置排序类型谜题

昨晚在回答这个问题时,我注意到以下几点:

也就是说,如果foo是一个可选的整数集,则对其排序会返回一组整数。

这不是我一开始所期望的,因为排序 aF[G[A]]应该返回 a G[F[A]](假设它F是可遍历的并且G 是一个 applicative functor)。但是,在这种情况下,Option图层就会消失。

Set我知道这可能与其中一种超类型和Unapply使工作的机器之间的某些交互有关sequenceU,当我能找到几分钟的时间时,我打算研究这些类型并写下正在发生的事情的描述.

不过,这似乎是一个可能很有趣的小谜题,我想我会把它贴在这里,以防有人能打败我的答案。

0 投票
2 回答
2888 浏览

scala - 将 scala 2.10 未来转换为 scalaz.concurrent.Future // 任务

有没有人来一段代码如何正确地将scala的未来(2.10)转换为新的scalaz7未来?我知道通过 scala Promise 将 scalaz future 转换为 scala Future 很热门,但不知道如何正确地做到这一点

例如

我想实施

那么显然是小菜一碟

因为那是我真正想要的:-)

0 投票
1 回答
1168 浏览

validation - 如何使用应用函子来结合 Scalaz 验证

无法弄清楚是否可以使用 Scalaz 7 编写类似的东西。我试图用代码块中的注释来表达自己。

我只是在 validateCombinations 中遇到了不同类型的令人困惑的编译错误,或者我在 validate 函数中得到的应用函子只有 2 个参数,其中一个是 ValidationNel [...] 类型。

0 投票
2 回答
766 浏览

scala - 如何在 EitherT 中返回元组

我正在使用 Scalaz 7 的 EitherT 来构建融合 State 和 \/. 到目前为止,一切都很好; 我得到的东西基本上是:

这使我可以构建在 <-.

但我不知道如何从状态动作中返回元组。单一的结果就好了——在下面的代码中,“val理解”正是我想要发生的。

但是当我想返回一个元组时,事情就崩溃了;“val otherComprehension”不会让我做

看起来它希望 \/ 的左侧是 Monoid,我不明白为什么。我错过了什么?

(Scalaz 7 2.0.0-SNAPSHOT,Scala 2.10.2)

编辑:我已经添加了 MyLeftType 是一个单子的证据,即使它不是。在我的真实代码中,MyLeftType 是一个案例类(称为 EarlyReturn),所以我可以提供一个零,但仅当参数之一为零时,追加才有效:

我不相信这是一个好主意,但它正在解决问题。