问题标签 [context-bound]

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 投票
2 回答
56 浏览

scala - 函数参数的隐式解析

我试图在 Scala 中实现合并排序。我得到以下内容:

这个问题不是关于正在进行的低效反转的淫秽数量,也不是关于缺乏尾递归的问题。相反,我注意到您可以通过传入如下排序算法来概括归并排序:

然后我尝试将mergesort重新实现为

但这无法编译,找不到正确的Ordering[A]

作为将事情纳入范围的微弱尝试,我尝试过

但无济于事。

我怀疑问题可能出在generalizedMergesort. 我说参数是 a List[A] => List[A],但我传入 a ,List[A] => implicit Ordering[A] => List[A]但我不知道如何利用它来实现我的目标,即mergesortgeneralizedMergesort和 本身方面实现。

0 投票
1 回答
158 浏览

scala - 如何避免具有多个类型类关系的模棱两可的转换链?

在我的库中,我有三个类型类:

在以下条件下,这些类型类可以相互转换:

  • 如果 typeT是一个scala.math.Numeric类型,那么它也是一个AbelianGroup.
  • 如果 typeT是 an AbelianGroup,它也是 a Monoid(目前是AbelianGroupextends Monoid,但不一定是这种情况)
  • 如果 typeT是类型 U 上的 Vector,并且类型 U 是 a Monoid,那么 typeT也是 a Monoid
  • 如果类型 T 是类型 U 上的 Vector,类型 U 是 a AbelianGroup,那么T也是 a AbelianGroup

例如,因为(Int, Int)是 Vector over type Int,并且Int是 AbelianGroup,那么(Int, Int)也是 AbelianGroup。

这些关系和其他关系很容易在伴随类中实现,如下所示:

在您尝试将元组类型之类的东西(Int, Int)用作 Monoid 之前,这非常有效。编译器找到两种方法来获取此类类型的 Monoid 类型类对象:

  1. Monoid.fromAbelianGroup(AbelianGroup.fromVector(Vector.from2Tuple, AbelianGroup.fromNumeric))

  2. Monoid.fromVector(Vector.from2Tuple, Monid.fromAbelianGroup(AbelianGroup.fromNumeric))

为了解决这种歧义,我修改了 Monoid 伴随类以包含从 Numeric 的直接转换(以及其他可直接转换为 的类型AbelianGroup)。

然而,这有点令人不满意,因为它本质上违反了 DRY 原则。当我为AbelianGroups 添加新的实现时,我必须在两个伴随对象中实现转换,就像我为Numeric和 OtherTypeX 等所做的那样。所以,我觉得我在某个地方走错了路。

有没有办法修改我的代码以避免这种冗余并解决编译时歧义错误?在这种情况下,最佳做法是什么?

0 投票
2 回答
357 浏览

scala - 不同顺序的案例类和同伴的隐式解析

通常,我先在同一个文件中写 a case class,然后是同伴object,就在下面。但是当试图implicit在同伴中导入声明时,我不得不切换声明的顺序(显然我不想要)。克服这种情况的推荐做法是什么?

对于具体情况,以下代码不起作用:

但是,如果我在它起作用object FooWorker之前声明。case class FooWorker我正在使用 Scala 2.11.6 和 SBT 进行测试。非常感谢!

0 投票
1 回答
483 浏览

scala - 如何将宏注释应用于具有上下文绑定的案例类?

当我尝试向我的案例类添加宏注释时:

我得到错误:

@macid只是标识函数,定义为白盒 StaticAnnotation:

未注释的代码有效:

如果我删除上下文绑定,它会起作用:

发生的事情是将上下文绑定脱糖为私有参数。以下脱糖代码得到相同的错误:

为了获得工作代码,我将隐式参数公开val

所以我的问题是:宏注释支持上下文边界的正确方法是什么?为什么编译器对宏注释生成的代码执行 no-private-parameters-of-case-classes 检查,但不对普通代码执行检查?

Scala 版本 2.11.7 和 2.12.0-M3 都报告错误。以上所有代码示例在 2.11.3 中都按预期编译和运行。

0 投票
2 回答
125 浏览

scala - Play Action Composition - 硬编码参数化解析器

我想创建一个自定义操作,它可以消除编写这样的操作的样板:

但是,我一直遇到类定义错误。这是我最成功的尝试:

但我收到以下错误:method composeAction overrides nothing.

如果我改成composeAction[A: Reads]composeAction[A]告诉我没有 A 类型的 Json 序列化器。

还有其他方法可以定义此自定义操作吗?

0 投票
1 回答
1887 浏览

scala - 定义在 trait 中绑定的 scala 上下文的简写

在 scala 抽象类中,如果你想定义一个上下文绑定,你可以简单地使用,例如 [T: ClassTag] 在参数中,但是这在 trait 中是不可能的:

如果你定义:

那么任何在 Bar 中读取 ctg 的尝试都会触发 StackOverflowError,因为隐式参数变为尾递归。

那么,让 ctg 在自动将子类公开到上下文绑定的特征中定义的最佳方法是什么?

0 投票
1 回答
97 浏览

scala - Scala isInstanceOf[T] 函数无法使用有界 ClassTag/TypeTag

以下代码:

在编译中产生以下内容:

奇怪的是,大小写匹配将按预期工作。有没有办法让 isInstanceOf[T] 也知道 ClassTag 上下文绑定?

0 投票
0 回答
38 浏览

scala - 尝试同时使用上限和上下文绑定时的 ScalaC 异常

尝试同时使用上限和上下文绑定时出现 scalac 异常。甚至允许吗?我在 Scala 2.11.8

考虑这个

在编译时我得到

我错过了什么?

更新:对我来说这看起来很神奇,但如果我改变字段的位置,错误就会消失message: T。如果它位于第 1 位或第 2 位,它会编译。谁能解释为什么?

0 投票
1 回答
61 浏览

scala - Scala:三重上下文边界,找不到证据参数

我已将其编辑为@Zhi Yuan Wang 回答的问题的更简单形式:

我收到以下错误:

尽管在 REPL 中得到以下信息:

智的遮阳篷是正确的。以下编译:

但是我仍然不认为这是正确的行为,因为这些是两种不同方法的参数,并且通常允许方法重用参数名称。

0 投票
2 回答
334 浏览

scala - Scala - 使用子上下文绑定方法覆盖特征方法

为了

这不成立。错误:

错误:(15, 7) 在 [U <: users.User](u: U)Boolean 类型的 trait AuthUserObject 中覆盖方法授权;方法授权具有不兼容的类型 def authorize[T <: Trader](t: T): Boolean ^

我需要限制AuthTraderObject用户Trader,因为只有交易者纳税。请问,这种覆盖怎么可能?