问题标签 [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.
scala - 函数参数的隐式解析
我试图在 Scala 中实现合并排序。我得到以下内容:
这个问题不是关于正在进行的低效反转的淫秽数量,也不是关于缺乏尾递归的问题。相反,我注意到您可以通过传入如下排序算法来概括归并排序:
然后我尝试将mergesort重新实现为
但这无法编译,找不到正确的Ordering[A]
:
作为将事情纳入范围的微弱尝试,我尝试过
但无济于事。
我怀疑问题可能出在generalizedMergesort
. 我说参数是 a List[A] => List[A]
,但我传入 a ,List[A] => implicit Ordering[A] => List[A]
但我不知道如何利用它来实现我的目标,即mergesort
在generalizedMergesort
和 本身方面实现。
scala - 如何避免具有多个类型类关系的模棱两可的转换链?
在我的库中,我有三个类型类:
在以下条件下,这些类型类可以相互转换:
- 如果 type
T
是一个scala.math.Numeric
类型,那么它也是一个AbelianGroup
. - 如果 type
T
是 anAbelianGroup
,它也是 aMonoid
(目前是AbelianGroup
extendsMonoid
,但不一定是这种情况) - 如果 type
T
是类型 U 上的 Vector,并且类型 U 是 aMonoid
,那么 typeT
也是 aMonoid
。 - 如果类型 T 是类型 U 上的 Vector,类型 U 是 a
AbelianGroup
,那么T
也是 aAbelianGroup
。
例如,因为(Int, Int)
是 Vector over type Int
,并且Int
是 AbelianGroup,那么(Int, Int)
也是 AbelianGroup。
这些关系和其他关系很容易在伴随类中实现,如下所示:
在您尝试将元组类型之类的东西(Int, Int)
用作 Monoid 之前,这非常有效。编译器找到两种方法来获取此类类型的 Monoid 类型类对象:
Monoid.fromAbelianGroup(AbelianGroup.fromVector(Vector.from2Tuple, AbelianGroup.fromNumeric))
Monoid.fromVector(Vector.from2Tuple, Monid.fromAbelianGroup(AbelianGroup.fromNumeric))
为了解决这种歧义,我修改了 Monoid 伴随类以包含从 Numeric 的直接转换(以及其他可直接转换为 的类型AbelianGroup
)。
然而,这有点令人不满意,因为它本质上违反了 DRY 原则。当我为AbelianGroup
s 添加新的实现时,我必须在两个伴随对象中实现转换,就像我为Numeric
和 OtherTypeX 等所做的那样。所以,我觉得我在某个地方走错了路。
有没有办法修改我的代码以避免这种冗余并解决编译时歧义错误?在这种情况下,最佳做法是什么?
scala - 不同顺序的案例类和同伴的隐式解析
通常,我先在同一个文件中写 a case class
,然后是同伴object
,就在下面。但是当试图implicit
在同伴中导入声明时,我不得不切换声明的顺序(显然我不想要)。克服这种情况的推荐做法是什么?
对于具体情况,以下代码不起作用:
但是,如果我在它起作用object FooWorker
之前声明。case class FooWorker
我正在使用 Scala 2.11.6 和 SBT 进行测试。非常感谢!
scala - 如何将宏注释应用于具有上下文绑定的案例类?
当我尝试向我的案例类添加宏注释时:
我得到错误:
@macid
只是标识函数,定义为白盒 StaticAnnotation:
未注释的代码有效:
如果我删除上下文绑定,它会起作用:
发生的事情是将上下文绑定脱糖为私有参数。以下脱糖代码得到相同的错误:
为了获得工作代码,我将隐式参数公开val
:
所以我的问题是:宏注释支持上下文边界的正确方法是什么?为什么编译器对宏注释生成的代码执行 no-private-parameters-of-case-classes 检查,但不对普通代码执行检查?
Scala 版本 2.11.7 和 2.12.0-M3 都报告错误。以上所有代码示例在 2.11.3 中都按预期编译和运行。
scala - Play Action Composition - 硬编码参数化解析器
我想创建一个自定义操作,它可以消除编写这样的操作的样板:
但是,我一直遇到类定义错误。这是我最成功的尝试:
但我收到以下错误:method composeAction overrides nothing.
如果我改成composeAction[A: Reads]
它composeAction[A]
告诉我没有 A 类型的 Json 序列化器。
还有其他方法可以定义此自定义操作吗?
scala - 定义在 trait 中绑定的 scala 上下文的简写
在 scala 抽象类中,如果你想定义一个上下文绑定,你可以简单地使用,例如 [T: ClassTag] 在参数中,但是这在 trait 中是不可能的:
如果你定义:
那么任何在 Bar 中读取 ctg 的尝试都会触发 StackOverflowError,因为隐式参数变为尾递归。
那么,让 ctg 在自动将子类公开到上下文绑定的特征中定义的最佳方法是什么?
scala - Scala isInstanceOf[T] 函数无法使用有界 ClassTag/TypeTag
以下代码:
在编译中产生以下内容:
奇怪的是,大小写匹配将按预期工作。有没有办法让 isInstanceOf[T] 也知道 ClassTag 上下文绑定?
scala - 尝试同时使用上限和上下文绑定时的 ScalaC 异常
尝试同时使用上限和上下文绑定时出现 scalac 异常。甚至允许吗?我在 Scala 2.11.8
考虑这个
在编译时我得到
我错过了什么?
更新:对我来说这看起来很神奇,但如果我改变字段的位置,错误就会消失message: T
。如果它位于第 1 位或第 2 位,它会编译。谁能解释为什么?
scala - Scala:三重上下文边界,找不到证据参数
我已将其编辑为@Zhi Yuan Wang 回答的问题的更简单形式:
我收到以下错误:
尽管在 REPL 中得到以下信息:
智的遮阳篷是正确的。以下编译:
但是我仍然不认为这是正确的行为,因为这些是两种不同方法的参数,并且通常允许方法重用参数名称。
scala - Scala - 使用子上下文绑定方法覆盖特征方法
为了
这不成立。错误:
错误:(15, 7) 在 [U <: users.User](u: U)Boolean 类型的 trait AuthUserObject 中覆盖方法授权;方法授权具有不兼容的类型 def authorize[T <: Trader](t: T): Boolean ^
我需要限制AuthTraderObject
用户Trader
,因为只有交易者纳税。请问,这种覆盖怎么可能?