问题标签 [scala-cats]
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.
scala - 用于系统测试 DSL 的实用免费单子:并发和错误处理
我正在尝试编写用于在 Scala 中编写系统测试的 DSL。在这个 DSL 中,我不想暴露某些操作可能异步发生(例如,因为它们是使用正在测试的 Web 服务实现的),或者可能发生错误(因为 Web 服务可能不可用)的事实,并且我们希望测试失败)。在这个答案中,不鼓励这种方法,但在用于编写测试的 DSL 上下文中,我并不完全同意这一点。我认为 DSL 会因为这些方面的引入而受到不必要的污染。
为了解决这个问题,请考虑以下 DSL:
现在假设我们要实现一个解释器,它利用我们的测试服务来放置和计算商店中的元素。由于我们使用网络,我希望put
操作异步进行。此外,鉴于可能发生网络错误或服务器错误,我希望程序在发生错误时立即停止。为了说明我想要实现的目标,这里是一个通过 monad 转换器混合 Haskell 中不同方面的示例(我无法转换为 Scala)。
M
所以我的问题是,你会为满足上述要求的解释器使用哪个 monad :
如果 M 是一个 monad 转换器,您将如何使用您选择的 FP 库(Cats、Scalaz)来组合它们。
scala - 猫无法解析符号|@|
我有以下代码,我从这里得到的:http: //underscore.io/blog/posts/2015/06/10/an-introduction-to-cats.html。
但是,我得到:
我的build.sbt
:
还有什么我应该导入或使用的吗?
scala - 为更高种类的接口生成适配器
我经常发现自己处于这样一个场景中,我定义了这样的接口:
然后,我编写了几个不同的实现,每个实现都在对特定实现最有意义的 Higher Kinded Type 上键入:
所有实现都是完全有效的,都返回包装在特定更高种类类型中的结果。
然后我经常来写一些业务逻辑,假设在我正在使用的逻辑块中Future
用作上下文,我可能会写这样的东西:
上面的代码可以很好地工作,FooImpl2
但是其他实现不能直接插入。在这种情况下,我总是写简单的适配器:
编写适配器很好,但它涉及很多样板,特别是对于具有大量功能的接口;更重要的是,每种方法对每种方法都得到完全相同的适应处理。我真正想做的是lift
现有实现的适配器实现,只在适配机制中指定一次。
我想我希望能够写出这样的东西:
所以我可以像这样使用它:
问题是:我该如何编写generateAdapterFn
函数?
我不确定如何解决这个问题,或者我的问题是否有其他常见模式或解决方案。我怀疑要编写generateAdapterFn
我想要的函数,我需要编写一个宏?如果是这样,那该怎么做?
scala - Dotty 将如何改变 Scala 中的纯函数式编程?
在2013 年的这个问题中,Odersky 先生指出,“现在说”像 Scalaz 这样的库是否能够在 Dotty 下存在(至少在当前状态下)还为时过早,因为对高等和存在主义类型的阉割。
随着时间的流逝,Dotty 对 Scalaz & Cats 的影响是否已经阐明?内置效果器和记录等提议的功能会改变这些项目的范围吗?
我知道 Dotty 距离取代 scalac 仍有一段距离,但由于我正在考虑投入时间将纯功能结构和方法应用于我的工作,我认为考虑其旗舰库的未来很重要。
scala - 堆叠免费单子
我正在学习 Free monad,并且我在 Scala 中整理了一个简单的示例,在其中我使用它们来定义两种特定于域的语言。
第一个 monad 处理存储库的副作用。我已经实现了一个解释器,它使用 state monad 来管理状态,但在实际程序中我会使用数据库。
第二个单子处理 IO。
然后,我可以把这两个“程序”放在一起
并运行他们做
我知道这远非理想,我想编写一个程序和一个支持的解释器:
所以问题是:
- 如何将两个单子堆叠在一起成为“完整程序”
- 如何将两个解释器组合成一个新的解释器?
- 如何处理返回的 Option[Todo]
find
,然后传递给represent
scala - 如何将 Either[Future[A], Future[B]] 转换为 Future[Either[A, B]]
我有一个实例,Either[Future[A], Future[B]]
我想将其转换为Future[Either[A, B]]
.
自从我上一个问题以来,cats 0.8.1已经发布,改变了库的结构并放弃Xor
了支持Either
,这在 2.12 中是偏右的。
因此,先前接受的答案中描述的方法不再起作用。我试图找到合适的进口但失败了。
看起来似是而非,但不幸的是不起作用。编译仍然失败value bisequence is not a member of Either[scala.concurrent.Future[A],scala.concurrent.Future[B]]
将导入范围扩大到*.all._
不会改变编译器错误。
我在 scala 2.11.8 上,因为并非该项目所依赖的所有库都发布了 2.12 版本
scala - Cats Free foldMap 未找到隐式 Monad
我有一个自然转换的解释器MyADT ~> MyState
。
我什么时候都没有问题type MyState[A] = State[MyClass, A]
。但是,如果我有type MyState[A] = State[MyClass, M[A]]
,其中 M 是任何单子,那么我会收到错误:could not find implicit value parameter M: cats.Monad[MyState]
调用foldMap
.
问题是什么?
scala - 在 Scala Cats Validated 中,如何组合有序验证
在https://gist.github.com/satyagraha/897e427bfb5ed203e9d3054ac6705704中,我发布了一个看似合理的 Scala Cats 验证场景,但我还没有找到一个非常简洁的解决方案。
本质上,有一个两阶段验证,其中验证各个字段,然后调用可能由于内部检查而抛出的类构造函数(通常这可能不在我的控制范围内更改,因此是异常处理代码)。如果任何字段验证失败,我们希望不调用构造函数,但也希望将任何构造函数失败合并到最终结果中。“快速失败”绝对适合两阶段检查。
这是一种flatMap
问题,cats.data.Validated
框架似乎通过cats.data.Validated#andThen
操作来处理。但是,正如您在代码中看到的那样,我找不到一个特别巧妙的解决方案。a 上可用的操作数量非常有限cats.syntax.CartesianBuilder
,我不清楚如何将它与andThen
操作联系起来。
欢迎任何想法!请注意,有一个 Cats 问题https://github.com/typelevel/cats/issues/1343可能是相关的,不确定。
scala - 在 Scala (cats 或 scalaz) 中转换函子 (F[A] => G[A])
Cats 或 Scalaz 中是否有在不同容器类型之间转换的类型类?例如
- 选项 ~> 试试
- 尝试~>未来
- 试试~>要么
- 选项 ~> 列表
似乎FunctionK
/ ~>
/NaturalTransformation
可能是我正在寻找的东西,但是没有为它们定义任何实例,我不知道为什么。
scala - Cats Monad 变形金刚
我正在尝试学习如何在猫库中使用 MonadTransformers 嵌套 monad。
所以我正在尝试为 Either[String, Option[A]] 构建一个数据类型
这是我写的代码
但我得到一个错误
我从一个正在使用的样本中获取了这个,Xor
但我猜想最新的猫库已被删除Xor
以支持 Either。