问题标签 [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.

0 投票
1 回答
377 浏览

scala - 如何让 Scala 中的类型安全和编译器检查枚举

我看到了关于这个问题的几个问题,但仍然找不到一个很好的答案:

我想要一个State Enum, 有 3 个状态:Good, NotGood, 和Unknown.

到现在为止,没什么大不了的。但由于状态来自外部 API(未记录,这就是Unknown状态的原因),它使用蛇案例,所以我做了一个findByName转换:

现在,有两个问题:

  • 第一:我希望编译器警告我有关非详尽匹配的信息。这可以使用密封特征来实现,这导致了我的第二个问题

  • 第二:在Unknown我想保存收到的值的情况下,但Enums在定义时获取名称,而不是在构造时获取名称。但是如果我有一个密封的特征,就像这个教程一样,我怎么能定义这样的场景呢?

我得到了类似的东西:

尽管如此,它unknown是硬编码的,我希望它是一个参数/构造函数参数。

还有,财产丢了findByname……

虽然我更喜欢使用“纯”Scala 的解决方案,但也希望看到一些使用 Shapeless 或 Cats 的解决方案

0 投票
0 回答
346 浏览

scala - 为什么 Functor 的这种递归隐式没有得到解决

我正在学习Functor[F[_]]s。我想为我想映射集合中的“叶”元素的所有情况提供隐式仿函数。

例如给定的实例:

现在,如果我想使用 Functor 映射元素,我需要提供他们的实例:

这将起作用:

在这一点上,由于缺少隐式(如预期的那样),下面将不起作用:

我可以通过提供组合的 Functor 来简单地修复它:

...嗯 - 这看起来有点像样板,不是吗?

尝试成为一个聪明的开发人员,我发现如果我只是使用某种递归风格来提供所有这些 Functor,那么它可能会有所帮助。这是我开发的:

它几乎可以工作了。至少对于 ,collection1但它没有为带有collection2和的示例提供隐式仿函数collection3

我认为这autoComposedFunctor[List, Option]将提供类型的隐式范围值,Functor[List[Option]]因此下次可以通过使用Functor[Option[List[Option]]]先前提供的实例调用相同的函数来获取并使用它来提供。但是id没有。

任何想法为什么?

(scalaVersion 是“2.11.6”)

0 投票
0 回答
231 浏览

scala - Cats 中 WriterTXorT monad 转换器的 MonadError 类型类实例

monad 转换器XorT继承自MonadError暴露错误处理功能。我想为它创建一个MonadError类型类的实例,WriterT[XorT ...]但我没有实现该handleErrorWith方法。

这是可以轻松完成的事情吗?这也是创建MonadError实例的最佳方法吗?

0 投票
1 回答
83 浏览

scala - Scala 无法在 scalaz 或猫中拉皮条 NaturalTransformation

由于某种原因,以下无法正常工作

test当我在自然变换上调用该方法时。Intellij 将其识别为扩展函数,但编译给出value test is not a member of cats.~>. 使用 scalaz NaturalTransformation 时也会发生同样的情况。我可以做些什么来帮助编译器识别扩展名吗?

Scala 版本是 2.11.8

一个失败的例子:

(上面使用了种类投影仪插件,但对于 lambdas 类型或单个参数更高种类的类型同样失败)

0 投票
1 回答
5958 浏览

haskell - 为什么 fmap 必须映射 List 的每个元素?

阅读《Learn you a Haskell For Great Good》一书和非常有用的 wiki 书籍文章Haskell Category Theory帮助我克服了将类别对象与编程对象混淆的常见类别错误,我仍然有以下问题:

为什么必须fmap映射列表的每个元素?

我喜欢它,我只是想了解这在理论上是如何合理的。(或者也许更容易证明使用 HoTT 的合理性?)

在 Scala 表示法中,List是一个函子,它接受任何类型并将其映射到所有列表类型集合中的类型,例如,它将类型映射到Int类型List[Int],并将函数映射到Int例如

  • Int.successor: Int => IntFunctor[List].fmap(successor) : List[Int] => List[Int]
  • Int.toString: Int => StringFunctor[List].fmap(toString): List[Int] => List[String]

现在每个实例List[X]都是一个带有empty函数mempty在 Haskell 中)和combine函数mappend在 Haskell 中)的幺半群。我的猜测是,可以使用 Lists 是 Monoids 的事实来表明map必须映射列表的所有元素。我的感觉是,如果添加pureApplicative 中的函数,这会给我们一个列表,其中只有一个其他类型的元素。例如Applicative[List[Int]].pure(1) == List(1)。由于map(succ)在这些元素上为我们提供了带有下一个元素的单例列表,因此这涵盖了所有这些子集。然后我想combine所有这些单例的函数为我们提供了列表的所有其他元素。不知何故,我认为这限制了地图的工作方式。

另一个建议性的论点是map必须在列表之间映射函数。由于 aList[Int]中的每个元素都是 Int 类型,如果一个映射到List[String]一个必须映射它的每个元素,否则一个将不是正确的类型。

因此,这两个论点似乎都指向了正确的方向。但我想知道剩下的路需要什么。

反例?

为什么这不是反例 map 函数?

似乎遵守规则

啊。但它不符合身份证法。

0 投票
1 回答
991 浏览

scala - 如何在 Scala 中堆叠应用函子

当您的计算步骤是独立的时,应用函子经常被提及作为 monad 的替代品。它们经常提到的一个优点是,当你想要堆叠应用程序时不需要转换器,因为F[G[X]]它始终也是一个应用程序。假设我有以下功能:

我想要优雅的堆叠以获得Future[Option[User]]andFuture[Option[Data]]并用process.

到目前为止,我只想到了这个(使用 Cats):

但我敢肯定这远非理想。有没有更优雅和通用的方法来实现同样的目标?

0 投票
1 回答
119 浏览

scala - 为什么我们需要分离 Apply 和 Applicative 类型的类?

我在猫文档中阅读了关于类型类ApplyApplicative. 我想知道为什么该库提供两个单独的类型类而不是一个类型类Applicative,它会扩展Functor和添加ap?有人用Apply那不是Applicative吗?

0 投票
1 回答
263 浏览

shapeless - Functor 错过参数实例的隐式值(仅在 sbt clean 之后)

我对小猫(https://github.com/milessabin/kittens)做了一些实验,但在编译我的代码时遇到了问题。我收到以下错误。

完整文件如下

我在 ScalaTest 中使用了几乎相同的代码,它编译没有任何问题。

我的 build.sbt 看起来如下 name := "shapeless-experiments"

最有趣的是,它作为增量编译的一部分进行编译。

如果我注释第 16、23 和 32 行,然后执行“sbt compile”,然后再次删除注释并执行它编译的“sbt compile/package”,我什至可以执行程序。但是一旦我运行“sbt clean”,它就不再编译了。

AdtDefns 对象基本上是https://github.com/milessabin/kittens/blob/master/core/src/test/scala/cats/derived/adtdefns.scala 的副本,相关部分是

PS:如果有人可以为 scala-kittens 创建一个标签会很好

0 投票
2 回答
402 浏览

scala - 对象功能阻抗失配

在 OOP 中,与接口而不是实现对话是一种很好的做法。所以,例如,你写这样的东西(Seq我的意思是scala.collection.immutable.Seq:)):

不是以下内容:

但是,在纯函数式编程语言(例如 Haskell)中,您没有子类型多态性,而是通过类型类使用临时多态性。因此,例如,您有列表数据类型和列表的一元实例。您无需担心使用接口/抽象类,因为您没有这样的概念。

在 Scala 等混合语言中,您同时拥有类型类(实际上是通过模式,而不是像 Haskell 中的一等公民,但我离题了)和子类型多态性。在scalaz,cats等等中,你有具体类型的单子实例,当然不是抽象的。

最后的问题是:鉴于 Scala 的这种混合性,您是否仍然尊重 OOP 规则来与接口对话,或者只是与具体类型对话以直接利用函子、单子等,而无需在需要时转换为具体类型。他们?换句话说,即使您想采用 FP 而不是 OOP,在 Scala 中与接口对话是否仍然是一种好习惯?如果不是,如果您选择使用List,并且后来您意识到 aVector会是更好的选择,该怎么办?

PS:在我的示例中,我使用了一种简单的方法,但同样的推理也适用于用户定义的类型。例如:

0 投票
2 回答
979 浏览

scala - 如何将未来的析取转换为析取的未来

我有一个方法的结果: val res: Future[Int] Xor Future[String] = getResult(x)

并想对其进行改造并将其用作Future[Int Xor String]

我无法从牧猫博客中推断出我的用例,并且不确定 monad 转换器是否是正确的工具,也许是某种形式的traverse?

Xorfrom cat 代表任何分离。Scalaz\/或 stdlibEither也可以(尽管我更喜欢有偏见的析取)。

谢谢