问题标签 [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.
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
)。
缺点是新读者乍一看无法猜测此方法返回TechnicalFailure
或CarCreationFailure
(BusinessFailure
so 的子类);只是一个太可怕了Throwable
。
他将被迫对Throwable
我的应用程序中包含的每种类型应用模式匹配,以确保不会忘记任何人... => 混乱。
这些解决方案中最干净的方法是什么,或者可能是……另一种?
scala - Scalaz 7 Iteratee 处理大型 zip 文件 (OutOfMemoryError)
我正在尝试使用 scalaz iteratee 包来处理恒定空间中的大型 zip 文件。我需要对 zip 文件中的每个文件执行一个长时间运行的过程。这些过程可以(并且应该)并行运行。
我创建了一个EnumeratorT
将每个膨胀ZipEntry
成一个File
对象。签名看起来像:
我想附加一个IterateeT
将对每个文件执行长时间运行的过程。我基本上得到了类似的东西:
当我尝试运行它时:
我收到一条java.lang.OutOfMemoryError: Java heap space
消息。这对我来说很有意义,因为它试图建立一个庞大的列表来存储所有这些IO
和Promise
对象。
几个问题:
- 有人对如何避免这种情况有任何想法吗?感觉就像我错误地解决了这个问题,因为我真的只关心
longRunningProcess
它的副作用。 - 这里的
Enumerator
方法是错误的方法吗?
我几乎没有想法,所以任何事情都会有所帮助。
谢谢!
更新#1
这是堆栈跟踪:
我目前正在接受 nadavwr 的建议,以确保一切都像我想的那样。我会报告任何更新。
更新#2
使用以下两个答案的想法,我找到了一个不错的解决方案。正如 huynhjl 建议的那样(我使用 nadavwr 的分析堆转储的建议进行了验证),consume
导致每个膨胀ZipEntry
都保存在内存中,这就是进程内存不足的原因。我更改consume
并foldM
更新了长时间运行的过程,只返回 aPromise[IOE[Unit]]
而不是对文件的引用。这样我最后就有了所有 IoExceptions 的集合。这是工作解决方案:
此解决方案会在异步上传每个条目时对它们进行膨胀。Promise
最后,我有一个包含任何错误的已完成对象的巨大列表。我仍然不完全相信这是对 Iteratee 的正确使用,但我现在确实有几个可重用、可组合的部分,可以在我们系统的其他部分中使用(这对我们来说是一种非常常见的模式)。
感谢你的帮助!
scala - 为什么 scalaz 的 Monoid for Option 实现会两次评估 f2 函数?
scalaz的option monoid定义如下:
f2
是按名称传递的参数,这意味着每次调用都会评估表达式。刚刚在模式匹配中求值的时候,为什么还要再求值呢?返回Some(a2)
应该是相同的结果,并且表达式f2
可能非常昂贵。
我错过了什么吗?
validation - 使用 Scalaz 7 在 Scala 中验证类的内聚方式
我的目标是在创建一个有效实例之前验证'方法User
中的字段:object
apply
User
我选择使用Validation
from 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
。
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]]]
?
scala - 如何将 F[A \/ B] 拆分为 (F[A], F[B])
我偶尔会遇到这样的代码:
或者在我目前的情况下,我想要Map[A, B \/ C] => (Map[A, B], Map[A, C])
F[A \/ B]
在对 F 进行适当限制的一般情况下,有没有一种很好的方法可以做到这一点?它看起来隐约像是 Unzip 主题的变体。
scala - 设置排序类型谜题
昨晚在回答这个问题时,我注意到以下几点:
也就是说,如果foo
是一个可选的整数集,则对其排序会返回一组整数。
这不是我一开始所期望的,因为排序 aF[G[A]]
应该返回 a G[F[A]]
(假设它F
是可遍历的并且G
是一个 applicative functor)。但是,在这种情况下,Option
图层就会消失。
Set
我知道这可能与其中一种超类型和Unapply
使工作的机器之间的某些交互有关sequenceU
,当我能找到几分钟的时间时,我打算研究这些类型并写下正在发生的事情的描述.
不过,这似乎是一个可能很有趣的小谜题,我想我会把它贴在这里,以防有人能打败我的答案。
scala - 将 scala 2.10 未来转换为 scalaz.concurrent.Future // 任务
有没有人来一段代码如何正确地将scala的未来(2.10)转换为新的scalaz7未来?我知道通过 scala Promise 将 scalaz future 转换为 scala Future 很热门,但不知道如何正确地做到这一点
例如
我想实施
那么显然是小菜一碟
因为那是我真正想要的:-)
validation - 如何使用应用函子来结合 Scalaz 验证
无法弄清楚是否可以使用 Scalaz 7 编写类似的东西。我试图用代码块中的注释来表达自己。
我只是在 validateCombinations 中遇到了不同类型的令人困惑的编译错误,或者我在 validate 函数中得到的应用函子只有 2 个参数,其中一个是 ValidationNel [...] 类型。
scala - 如何在 EitherT 中返回元组
我正在使用 Scalaz 7 的 EitherT 来构建融合 State 和 \/. 到目前为止,一切都很好; 我得到的东西基本上是:
这使我可以构建在 <-.
但我不知道如何从状态动作中返回元组。单一的结果就好了——在下面的代码中,“val理解”正是我想要发生的。
但是当我想返回一个元组时,事情就崩溃了;“val otherComprehension”不会让我做
看起来它希望 \/ 的左侧是 Monoid,我不明白为什么。我错过了什么?
(Scalaz 7 2.0.0-SNAPSHOT,Scala 2.10.2)
编辑:我已经添加了 MyLeftType 是一个单子的证据,即使它不是。在我的真实代码中,MyLeftType 是一个案例类(称为 EarlyReturn),所以我可以提供一个零,但仅当参数之一为零时,追加才有效:
我不相信这是一个好主意,但它正在解决问题。