问题标签 [implicits]

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 投票
4 回答
1119 浏览

scala - 模棱两可的暗示

问题是为什么下面的代码不能与类型推断一起工作(下面是一个 REPL 会话来演示),它可以修复吗?更具体地说,这与编译器用来推断返回类型的 CanBuildFrom 的使用有何不同?

鉴于此代码:

我在 REPL (2.8.1) 中有这个会话:

0 投票
1 回答
548 浏览

generics - Scala 的隐式可以组合来转换更高种类的类型吗?

假设我有一个名为 LongArrayWritable 的类型,它是 Long 数组的盒装表示。我有在这些类型之间转换的隐式定义:

现在,我也有隐式在 java.lang.Iterable 和 scala.collection.List[X] 之间转换的通用形式:

有了这些定义,scala 编译器可以推断出 java.lang.Iterable[LongArrayWritable] 和 List[Array[Long]] 之间的隐式转换(相当于iterator2list(iterator).map(unboxLongArray(_))),或者这超出了implicits 的能力,因此需要它自己的(显式?)隐式定义?

谢谢,

蒂姆

0 投票
2 回答
50331 浏览

scala - Scala 在哪里寻找隐式?

对于 Scala 的新手来说,一个隐含的问题似乎是:编译器在哪里寻找隐含?我的意思是含蓄的,因为这个问题似乎永远不会完全形成,就好像没有文字一样。:-) 例如,integral下面的值来自哪里?

对于那些决定学习第一个问题的答案的人来说,另一个问题是编译器如何选择使用哪个隐式,在某些明显模棱两可的情况下(但无论如何编译)?

例如,scala.Predef定义了两个从 的转换String:一个到WrappedString,另一个到StringOps。然而,这两个类共享很多方法,那么为什么 Scala 在调用时不抱怨歧义map呢?

注意:这个问题的灵感来自另一个问题,希望以更一般的方式说明问题。该示例是从那里复制的,因为它在答案中被引用。

0 投票
4 回答
288 浏览

scala - 关于 Scala 中类型类的问题

让有类Fruit,OrangeApple

现在我想为write这两种类型OrangeApple. 使用类型类模式,我可以执行以下操作:

所以,很好,但是如果我想定义writeFruits呢?

我想writeFruits打电话write[Apple]write[Orange]每个fruit. 我看到它不起作用(我知道为什么),但也许我可以实现writeFruits

我可以writeFruits以某种方式实施吗?

0 投票
3 回答
193 浏览

oop - 如何处理特定类型集合的操作?

在我的应用程序的几个不同地方,我需要使用 aSeq[SalesRow]并返回 a Map[String,SalesRow],其中的字符串是一个国家/地区的名称。

我需要在几个地方使用它。例如,我列出所有 SalesRows 并按国家/地区获得全球销售额细分。但在其他地方,我想按月和国家/地区细分我的销售额(这样Map[Month,Seq[SalesRow]]就变成Map[Month,Map[String,Seq[SalesRow]]]了)——在其他地方,我想按天细分,然后按国家/地区细分。

Seq[SalesRow]我的问题是:我在哪里放置需要 a并将国家地图返回到行的(少量)逻辑?现在,我将它放在伴随对象方法中,SalesRow.byCountry(rows : Seq[SalesReport]. 那是最优的吗?

我想到了一个稍微疯狂的想法,那就是创建一个从Seq[SalesRow]to的隐式转换EnhancedSalesRowSeq,它有一个byCountry实例方法。这对我很有吸引力,因为该操作适用于任何 SalesRows 序列。

这是一个好主意吗?

将逻辑添加到伴生对象是我的最佳选择,还是有更好的选择?

谢谢。

0 投票
2 回答
697 浏览

scala - 两种看似相同的语义:一种是隐式绑定,另一种不

你好:我最近一直在学习 Scala(我的相关背景主要是 C++ 模板),我遇到了一些我目前对 Scala 不了解的东西,这让我发疯了。:(

(另外,这是我在 StackOverflow 上的第一篇文章,我注意到大多数非常棒的 Scala 人似乎都在闲逛,所以如果我对这个机制做了一些非常愚蠢的事情,我真的很抱歉。)

我的具体困惑与隐式参数绑定有关:我提出了一个特定情况,即隐式参数拒绝绑定,但具有看似相同语义的函数却可以。

现在,它当然可能是一个编译器错误,但鉴于我刚刚开始使用 Scala,我已经遇到某种严重错误的可能性非常小,以至于我期待有人解释我做错了什么。;P

我已经浏览了代码并对其进行了相当多的削减,以便提出一个不起作用的示例。不幸的是,这个例子仍然相当复杂,因为这个问题似乎只出现在泛化中。:(

1) 不按我预期的方式工作的简化代码

此代码使用 Scala 2.9.0.1 编译,返回以下错误:

在这种情况下,我的期望runAll是绑定runrunAny.

现在,如果我修改runAll它,而不是直接获取它的两个参数,而是返回一个函数,该函数又接受这两个参数(我想尝试的技巧,因为我在其他人的代码中看到它),它可以工作:

2) 修改后的代码具有相同的运行时行为并且实际工作

从本质上讲,我的问题是:为什么会这样?;( 我希望这两个函数具有相同的整体类型签名:

如果它有助于理解问题,其他一些更改也“起作用”(尽管这些更改了函数的语义,因此不是可用的解决方案):

3)runAll通过将 Output 替换为 HNil 仅对第二级进行硬编码

4) 从隐式函数中删除上下文参数

任何人对此可能有的任何解释将不胜感激。:(

(目前,我最好的猜测是隐式参数相对于其他参数的顺序是我遗漏的关键因素,但我感到困惑的是:runAny最后也有一个隐式参数,所以明显的“implicit def不能很好地与尾随implicit”对我来说没有意义。)

0 投票
1 回答
331 浏览

scala - Scalaz `F[_] : Applicative` 类型约束如何暗示使用隐式参数?

我正在努力理解TraverseScalaz 中 trait 中的以下函数定义:

def traverse[F[_] : Applicative, A, B](f: A => F[B], t: T[A]): F[T[B]]

我不明白的部分是F[_] : Applicative

现在,让我们看看是什么Applicative

在这里,要traverse为某种类型工作F,需要Applicative[F]在范围内引入一个类型的隐式对象。

我想了解几件事:

  1. 笏到底F[_] : Applicative是什么意思?
  2. 为什么F[_]有关系Applicative?我们需要Applicative[F],而不是 F[something] extends Applicative 对吗?
  3. 为什么此方法使用类型的隐式值Applicative[F]而不声明隐式参数?
0 投票
1 回答
515 浏览

scala - 为什么 DummyImplicit 不能消除 [String](a: A) 与 (a: String) 的歧义

给定以下代码:

Scala 编译器在看到以下值时会抱怨“对重载定义的模糊引用”:

第 1 行:我的意图是将值类型“String”以及它所产生的所有属性的名称“foo”传递给产生“Attributes”的工厂“Attr”。

第 2 行:使用先前配置的属性工厂,我实际上正在生成一个名为“foo”的属性,其值为“bar”,类型为“String”。

我的结论:因为这个工厂对象的参数化类型“A”是“String”,所以 Scala 编译器推断方法“apply”的相同参数签名是“(value:String)”,这是模棱两可的。因此,我尝试通过添加隐式参数列表来改变签名。

在阅读了一篇关于类型擦除和 DummyImplicit的文章并查阅了 Scala 参考部分“7.2 隐式参数”后,我认为“(隐式假人:DummyImplicit)”可以解决问题

目前我的解决方案是使用最小的包装器:

假设可以找到“Str To Txt”类型的隐式值,即合适的转换函数,则上面的第二行编译,即:

看来我想得太复杂了。apply而不是用参数列表重载方法(value: String),我只是摆脱了它。完全符合我期望的版本现在看起来像:

0 投票
2 回答
418 浏览

scala - 如何将 (implicit conv: String => A) 表示为视图绑定

我在问自己什么是视图绑定等价于

我的第一次尝试是简单地声明类型参数A,如下所示:

但是 Scala 编译器抱怨"not found: type A"

有什么建议么?

0 投票
1 回答
422 浏览

scala - Scala:如何让上下文绑定 List[T] 转换在这里工作?

这是我在这里的第一个问题,所以希望我提供足够的细节。随时要求澄清。

考虑到以下几点,这是可行的:

这段代码将 Option 包装的 BSON 片段转换为另一个 Option[T]。我认为这同样适用于列表,但以下内容无法编译:

我将以下代码用于一般机制:

编译器错误: could not find implicit value for parameter reader: project.marshalling.bson.BsonReader[T,com.mongodb.casbah.Imports.DBObject] cur.map(_.fromBson[T]).toList

这让我觉得很奇怪,因为编译器似乎试图在调用 fromBson 之前评估 T 以提供类型。这让我觉得特别奇怪,因为选项阅读器似乎没有这样的抱怨。我最近才开始认真地用 Scala 编写代码,所以我确信我在这里遗漏了一些东西。

如果您需要更多信息,请告诉我,希望您能提供帮助。

最好的,

短剑