问题标签 [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 - 如何让 Scala 中的类型安全和编译器检查枚举
我看到了关于这个问题的几个问题,但仍然找不到一个很好的答案:
我想要一个State Enum
, 有 3 个状态:Good
, NotGood
, 和Unknown
.
到现在为止,没什么大不了的。但由于状态来自外部 API(未记录,这就是Unknown
状态的原因),它使用蛇案例,所以我做了一个findByName
转换:
现在,有两个问题:
第一:我希望编译器警告我有关非详尽匹配的信息。这可以使用密封特征来实现,这导致了我的第二个问题
第二:在
Unknown
我想保存收到的值的情况下,但Enums
在定义时获取名称,而不是在构造时获取名称。但是如果我有一个密封的特征,就像这个教程一样,我怎么能定义这样的场景呢?
我得到了类似的东西:
尽管如此,它unknown
是硬编码的,我希望它是一个参数/构造函数参数。
还有,财产丢了findByname
……
虽然我更喜欢使用“纯”Scala 的解决方案,但也希望看到一些使用 Shapeless 或 Cats 的解决方案
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”)
scala - Cats 中 WriterTXorT monad 转换器的 MonadError 类型类实例
monad 转换器XorT
继承自MonadError
暴露错误处理功能。我想为它创建一个MonadError
类型类的实例,WriterT[XorT ...]
但我没有实现该handleErrorWith
方法。
这是可以轻松完成的事情吗?这也是创建MonadError
实例的最佳方法吗?
scala - Scala 无法在 scalaz 或猫中拉皮条 NaturalTransformation
由于某种原因,以下无法正常工作
test
当我在自然变换上调用该方法时。Intellij 将其识别为扩展函数,但编译给出value test is not a member of cats.~>
. 使用 scalaz NaturalTransformation 时也会发生同样的情况。我可以做些什么来帮助编译器识别扩展名吗?
Scala 版本是 2.11.8
一个失败的例子:
(上面使用了种类投影仪插件,但对于 lambdas 类型或单个参数更高种类的类型同样失败)
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 => Int
到Functor[List].fmap(successor) : List[Int] => List[Int]
Int.toString: Int => String
到Functor[List].fmap(toString): List[Int] => List[String]
现在每个实例List[X]
都是一个带有empty
函数(mempty
在 Haskell 中)和combine
函数(mappend
在 Haskell 中)的幺半群。我的猜测是,可以使用 Lists 是 Monoids 的事实来表明map
必须映射列表的所有元素。我的感觉是,如果添加pure
Applicative 中的函数,这会给我们一个列表,其中只有一个其他类型的元素。例如Applicative[List[Int]].pure(1) == List(1)
。由于map(succ)
在这些元素上为我们提供了带有下一个元素的单例列表,因此这涵盖了所有这些子集。然后我想combine
所有这些单例的函数为我们提供了列表的所有其他元素。不知何故,我认为这限制了地图的工作方式。
另一个建议性的论点是map
必须在列表之间映射函数。由于 aList[Int]
中的每个元素都是 Int 类型,如果一个映射到List[String]
一个必须映射它的每个元素,否则一个将不是正确的类型。
因此,这两个论点似乎都指向了正确的方向。但我想知道剩下的路需要什么。
反例?
为什么这不是反例 map 函数?
似乎遵守规则
啊。但它不符合身份证法。
scala - 如何在 Scala 中堆叠应用函子
当您的计算步骤是独立的时,应用函子经常被提及作为 monad 的替代品。它们经常提到的一个优点是,当你想要堆叠应用程序时不需要转换器,因为F[G[X]]
它始终也是一个应用程序。假设我有以下功能:
我想要优雅的堆叠以获得Future[Option[User]]
andFuture[Option[Data]]
并用process
.
到目前为止,我只想到了这个(使用 Cats):
但我敢肯定这远非理想。有没有更优雅和通用的方法来实现同样的目标?
scala - 为什么我们需要分离 Apply 和 Applicative 类型的类?
我在猫文档中阅读了关于类型类Apply
和Applicative
. 我想知道为什么该库提供两个单独的类型类而不是一个类型类Applicative
,它会扩展Functor
和添加ap
?有人用Apply
那不是Applicative
吗?
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 创建一个标签会很好
scala - 对象功能阻抗失配
在 OOP 中,与接口而不是实现对话是一种很好的做法。所以,例如,你写这样的东西(Seq
我的意思是scala.collection.immutable.Seq
:)):
不是以下内容:
但是,在纯函数式编程语言(例如 Haskell)中,您没有子类型多态性,而是通过类型类使用临时多态性。因此,例如,您有列表数据类型和列表的一元实例。您无需担心使用接口/抽象类,因为您没有这样的概念。
在 Scala 等混合语言中,您同时拥有类型类(实际上是通过模式,而不是像 Haskell 中的一等公民,但我离题了)和子类型多态性。在scalaz
,cats
等等中,你有具体类型的单子实例,当然不是抽象的。
最后的问题是:鉴于 Scala 的这种混合性,您是否仍然尊重 OOP 规则来与接口对话,或者只是与具体类型对话以直接利用函子、单子等,而无需在需要时转换为具体类型。他们?换句话说,即使您想采用 FP 而不是 OOP,在 Scala 中与接口对话是否仍然是一种好习惯?如果不是,如果您选择使用List
,并且后来您意识到 aVector
会是更好的选择,该怎么办?
PS:在我的示例中,我使用了一种简单的方法,但同样的推理也适用于用户定义的类型。例如:
scala - 如何将未来的析取转换为析取的未来
我有一个方法的结果:
val res: Future[Int] Xor Future[String] = getResult(x)
并想对其进行改造并将其用作Future[Int Xor String]
我无法从牧猫博客中推断出我的用例,并且不确定 monad 转换器是否是正确的工具,也许是某种形式的traverse
?
Xor
from cat 代表任何分离。Scalaz\/
或 stdlibEither
也可以(尽管我更喜欢有偏见的析取)。
谢谢