问题标签 [scalaz]
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 - Group values by a key with any Monoid
I would like to write a method mergeKeys
that groups the values in an Iterable[(K, V)]
by the keys. For example, I could write:
However, I would like to be able to use any Monoid
instead of writing a method for List
. For example, the values may be integers and I want to sum them instead of appending them in a list. Or they may be tuples (String, Int)
where I want to accumulate the strings in a set but add the integers. How can I write such a method? Or is there something else I can use in scalaz to get this done?
Update: I wasn't as far away as I thought. I got a little bit closer, but I still don't know how to make it work if the values are tuples. Do I need to write yet another implicit conversion? I.e., one implicit conversion for each number of type parameters?
scala - 解释 scalaz-7 中的 Traverse[List] 实现
我试图了解scalaz-7traverseImpl
中的实现:
有人可以解释如何与List
交互Applicative
吗?最终,我希望能够为Traverse
.
validation - Scalaz:在理解和日志记录中进行验证
我承认标题不是很明确:对不起。
假设我有一个理解:
Validation1、Validation2 和 Validation3 进行一些检查(例如“年龄 > 18”)并使用失败/成功;所以如果有什么问题,理解中止,我在结果的失败部分得到原因,否则我在成功部分得到预期值。到目前为止,一切都很好,没有什么难的。
但是如果 Validation1、Validation2、Validation3 的输入满足某些规则(例如:“这个人可以投票,因为他的年龄大于 18 岁并且他的国籍是法国”),则它们是成功的。我想要的是跟踪应用的规则,以便能够在最后显示它们。
这显然是一个日志记录的用例。但我在这样做的路上犹豫不决:
拥有一个可被任何函数访问的对象“logger”(Validation1、2 和 3,还有想要显示日志内容的调用者)
使记录器成为Validation1、2和3的参数
等待“Scala 中的函数式编程”的相关章节:)
其他?
感谢您的建议
4月10日编辑
所以,假设我想计算函数:x -> 1/sqrt(x)
首先,我通过检查 x > 0 来计算 sqrt(x),然后如果不为零,则取逆。
使用 scalaz.Validation,很简单:
现在,如果平方根成功,我想记录字符串successsquaretoot,如果逆成功,我想记录字符串successinverse,以便函数resultat在成功的情况下累积两个字符串
我按照 Yo Eight 的建议从 ValidationT 开始:
但我找不到如何将它们组合起来以供理解。此外,要获得其中一个的结果,我必须写: squareroot2(4).run.run 这看起来很奇怪,而且我写它的方式,即使在失败的情况下,字符串 successsquareroot 也会被记录:
打印:(平方根确定,失败(不能取负数的平方根))
谢谢!贝努瓦
4月12日编辑
所以 Yo 八建议了这个片段:
他警告我一些类型注释是必要的。实际上, squareroot 和 inverse 的返回 tpye 相当难看:这是我难以理解的东西的 ValidationT!
因此,我必须明确指定返回类型: def inverse(x:Double) : ValidationT[?,E,A] 其中“E”是字符串,“A”是 Double(这很简单!)。但是第一个呢?它必须是一个单子(据我所知),我选择了最简单的:Id(即身份)。
所以现在我们有:
但是 for-comprehension 无法编译,因为“y”不是 Double 而是 WriterT[Id, String, Double] 此外,第一个记录的消息(“Squareroot ok”)是“丢失”。
最终,我确实喜欢这样:
这使 :
凉爽的!我最好为 Writer 使用 List[String] ,但我认为我做得很好!
现在,我可以考虑我的假期(明天!):)
5月14日编辑
好吧,代码没有编译,但错误在八八的最后一个建议中(注意,这又不是冒犯八八谁是善良的典范!)。我向您提交完整的代码和错误:
这是终端的会话:
我想我从一开始就错过了一些东西,这可以解释为什么我坚持了几个星期!
贝努瓦
5月15日编辑
编译你的代码,我有第一个错误:
经过一些尝试,我以这种方式重写了导入:
还有一个错误:
您在 5 月 14 日编写的代码中出现了此错误。显然,很难理解使用 scalaz-7 究竟要导入什么内容。使用版本 6,事情看起来更简单:只需导入 scalaz._ 和 Scalaz._
我觉得自己像一个“绝望的家庭主妇”:)(是的,我同意,这不是很精明,但很放松!)
贝努瓦
5月23日
哎呀!它可以有效地与 scalaz-7 的最新版本一起使用:请注意,我必须构建它而不是下载快照。
那太棒了!
对于那些感兴趣的人,这里是输出:
哟八,如果有一天我们偶然相遇,我会给你一杯啤酒!
贝努瓦
scala - 如何将 Haskell 翻译成 Scalaz?
我和我的一个高中生将尝试将 Haskell 的 Parsec 解析器组合库移植到 Scala 中。(与 Scala 的内置解析库相比,它的优势在于您可以相当轻松地传递状态,因为所有解析器都是单子。)
我遇到的第一个障碍是试图弄清楚 Functor 在 scalaz 中是如何工作的。有人可以解释如何转换这个 Haskell 代码:
进入 Scala(我假设使用 Scalaz)。我做到了
并且知道我应该Reply
扩展这个scalaz.Functor
特征,但我不知道该怎么做。(大多数情况下,我无法弄清楚F[_]
参数的作用。)
任何帮助表示赞赏!
谢谢,托德
根据 dflemstr 的回答,我想出了这个:
我不确定的是那种ReplySU[A]
类型。Functor
Haskell 中的实际是Reply s u
咖喱类型和a
缺少类型。这是我应该如何在 Scala 中做同样的事情,还是我过于复杂了?
scala - 在深度复制到地图值时避免使用镜头重复
我有一个不可变的数据结构,其中我在 Maps 中有嵌套值,如下所示:
另外,我有一个当天所有交易的清单,我想生成TradingDay
结构,其中
我试图通过折叠我的交易来弄清楚如何用镜头更新这个结构(见附录):
这行得通;但我想知道我是否可以减少重复性(在添加到地图然后修改地图键处的值方面。它似乎并不比相关的深层副本更烦人。
附录 - 镜片
scala - 隐式 Monoid[Int] 等在哪里实现
我尝试学习/理解一点 scalaz。为此,我从示例开始:
所以某处必须是一个 Foldable[List[_]] 和一个 Monoid[Int] (附加 = + 和零 = 0)。但我无法找到这两个隐式。有没有简单的方法可以找到它们?
然后下一个例子是:
在这里,我变得更加困惑。我假设乘法必须将 Monoid[Int] 替换为 append = *, zero = 1 的一个。但是 f: A=>B 丢失了。如果我遵循乘法,我找不到任何与 Monoid 或函数等相关的东西。
scala - 规范化验证错误类型
我试图找到最方便的方法来规范化一个“上”层中的 scalaz.Validations 中的错误类型,该层调用返回“下”层上具有不同错误类型的验证的方法。自然地,需要为每个较低级别的错误类型定义一个到上层错误类型的映射,但我似乎无法绕过在 for 理解中提供显式类型提示,以便获取我的隐式。我想将错误类型的显式转换(例如通过 .fail.map(...).validation如下:
没有类型提示的编译器错误(2.9.2):
发现一个错误
如果做这种事情的愿望暗示了我如何处理这种错误处理的问题,我也很感激指导。
eclipse - 在 eclipse ide 中包含和使用 scalaz
我尝试在 eclipse ide 中使用 scalaz 库。我下载 scalaz-full_2.9.1-6.0.4.jar 并转到 java build 选项卡中的项目属性和 scalaz-full_2.9.1-6.0.4.jar 到外部 jar。
然后我写:
在我的 scala 文件中并得到错误:
未找到:值 scalaz
如何正确地将 scalaz lib 包含到我的项目中?
谢谢你。
scala - scalaz 中有 >> monad 运算符吗?
如果没有 Haskell 的 >> (monad replace?) 运算符,我可以在 scalaz 中执行此操作:
Scalaz(6)中有这样的运算符吗?到这里后,是否有任何辅助操作,例如展平/连接等?这些在哪里定义?
scala - Scala 关于 Scalaz 的类型推断状态
正如 Alexej对此问题的回答所见,在 a 上运行序列时,Seq[Validation[X, A]]
您需要一个样板显式类型参数sequence[({type L[Y] = Validation[X, Y]})#L, Y]
。
其他数据类型/函数可能会发生同样的需求。
通过改进类型推断来消除对此类显式类型的需求的相关问题是:
理论上可以在Scala中做吗?
如果是,这是否在 Scala 路线图上?什么时候可以预期解决方案?
如果不在路线图上,那么解决方案是否容易/适中/难以实现?
一个普通人能做些什么来推进这个案子吗?
欢迎任何有关该问题的指示。
(这里是一个稍微相关的问题,但不讨论未来的前景)