问题标签 [implicit-parameters]

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 投票
1 回答
86 浏览

scala - 其他文件中相同范围内的隐式参数

在http://docs.scala-lang.org/tutorials/FAQ/finding-implicits.html查看隐式参数(和转换)优先规则,我发现以下优先级列表:

  1. 首先查看当前范围
  2. 当前范围内定义的隐式
  3. 显式导入
  4. 通配符导入
  5. 其他文件中的相同范围
  6. ...

我想知道为什么其他文件中的相同范围被划掉了。是否有待实施的功能?它是否因某种原因被删除?我到目前为止的经验表明该功能不可用,但我想知道为什么会列出它。

0 投票
2 回答
462 浏览

scala - Scala - 抽象类型和隐式参数解析

我正在使用 Scala 2.10.4。

请用类比进行 - 实际代码深深嵌入在一个复杂的程序中,所以我不会解释这个问题,而是以一种历史悠久的方式抽象这个问题来谈论动物 ;-)

在 scala 中,我有 2 个特征 - 例如:

动物HouseBase

我无法更改 Animal,但我从它继承了 Dog、Rabbit、Fish 等类。令人讨厌的是,我无法更改每个子类,因为我不拥有我使用的所有子类。

我的动物都住在某个地方——它们的家必须从 HouseBase 继承。我可以更改 HouseBase 及其子类(如果必须,通过另一层抽象)。

所以 Dog 是 Animal 的子类,并且会生活在作为 HouseBase 子类的 Kennel 中。

兔子会住在笼子里,鱼会住在缸里。

请注意,这里没有强制执行 1:1 的关系 - 鱼也可以生活在池塘中,我们也必须能够处理它。

我希望的是——给定一个通过抽象类型 Animal 引用的具体动物(例如 Fish),并给定一个具体的返回类型(例如 Tank),Scala 将能够自动选择正确的隐式参数我在下面的设计。

但是有两个相关的问题。

问题 1 - 如果动物作为抽象引用,则隐式参数将仅查找采用抽象类型(动物)而不是底层具体类型的函数。我怀疑解决方案可能是使用 ClassTags,因为 Scala 似乎没有使用运行时信息?我尝试实现了这一点,但毫无希望地迷失了(我对 Scala 还很陌生!)。

问题 2 - 如果我的动物可以生活在不止一种类型的房子中,那么就会出现类似的问题,即使指定了具体的返回类型,编译器也会发现 Fish 的 2 个隐含对象不明确。我有点难过在这里做什么!

我可以使用手动样板来设计解决方案以在运行时匹配类型,但这不是很可扩展。

任何想法都感激不尽!其余代码如下。

编辑 - 这些链接似乎证实了我的怀疑。使用了编译时多态性,因此无法知道运行时类型:

http://like-a-boss.net/2013/03/29/polymorphism-and-typeclasses-in-scala.html

https://softwareengineering.stackexchange.com/questions/258698/is-it-possible-to-have-ad-hoc-polymorphism-with-runtime-dispatch

所以,我想我现在的问题是,鉴于此,有没有办法修改我的示例以使用运行时调度?

动物:

房屋和隐含:

0 投票
1 回答
474 浏览

scala - implicit parameters and generic types

i'm trying to understand the behavior of the compiler in this situation

the code above does not compile and gives the following error:

ambiguous implicit values: both method $conforms in object Predef of type [A]⇒ <:<[A,A] and value bar in object ImplicitTest of type ⇒ String ⇒ Int match expected type String ⇒ T

as the error says my implicit value is conflicting with another implicit defined in Predef... based on this it seems there is no way to declare an implicit parameter to a function converting a value from a known type to an unknown (generic) type.

Is this due to some technical limitation on the compiler or is just the way it is supposed to work, and i'm violating some constraints i'm not aware of?

0 投票
1 回答
129 浏览

android - Scala:如何覆盖隐式构造函数参数?

我目前正在为 Android ( https://github.com/bertderbecker/scalandroid ) 开发一个小的 scala DSL。

如何告诉 SNavigationView 使用 SDrawerLayout 作为其父级,而不是 DrawerLayout 的父级?

所以,更一般地说,我想要一个类 foo (0) ,它将 foo (-1) 作为隐式参数,并且您可以在其中定义一个 foo (+1),它将从作为隐式参数开始。

所以 foo 是“递归的”。

我想要的是:

0 投票
1 回答
125 浏览

haskell - 设置隐式参数上下文的函数

我一直在使用隐式参数,有时我发现这些参数很有用,但试图做一些类似下面的代码(不能编译)

我想要的基本上是一个f使用“上下文”运行给定函数的函数。在上述情况下,f zz与 一起运行?x = 42,在这种情况下自然只会返回42,因此该程序应该打印42。但我得到了错误:

z这是因为它第一次使用的地方没有上下文main,即使f提供了上下文。

我尝试这样做的原因是因为我有许多使用隐式参数的函数,以及一个GADT具有不同但相似的实现选项的函数。编写一个从每个可能的GADT构造函数中提取适当的隐式参数的函数相对简单,但是我想应用一个带有这些隐式参数的函数。

像这种方法(编译)会很好,或者另一种方法允许我轻松地为各种函数设置隐式参数上下文也很好。

0 投票
1 回答
62 浏览

java - 为什么 Scala 更喜欢隐式参数而不是扩展 trait?

Scala 排序 API 使用隐式对象。例如:

Java 使用 Comparable 接口来达到同样的目的。

为什么 Scala 更喜欢隐式类型而不是扩展 trait?隐式参数有什么好处?

0 投票
1 回答
84 浏览

scala - 起吊方法出错

我有一个带有隐式参数的方法。当我在 2 种情况下将其转换为函数时出现错误:

1:

然后我得到一个 StackOverflowError。

2:</p>

然后我得到一个错误:缺少参数类型

我必须这样写:

没关系。如果 'action' 的参数不是隐式的,则所有情况都是正确的。那么如何解释,我想念什么?

0 投票
1 回答
537 浏览

java - 从 Java 调用具有多个隐式参数的主构造函数

我有一个 Scala 类,它使用 Apache Spark 中的 MR 作业返回输入类型 IN 的最大值。如果我从 Scala 调用它,这个类可以正常工作,它的工作原理如下:

现在我想让它也可以从java调用,但是我在传递隐式参数时遇到了一些困难。我知道隐式参数可以通过将它们附加到 Java 中的参数列表来传递,但隐式参数在 Scala 中。因此,我正在尝试执行以下操作:

然后可以从java中调用它:

我尝试了许多从辅助构造函数传入隐式的排列,使用implicity implicit和玩弄逗号和括号。但是,它总是抱怨找不到 ev$1 和 ev$2。但是我必须传入参数,否则会出错:

如果我尝试:

结果是:

我错过了什么/误解了什么?谢谢!

0 投票
1 回答
674 浏览

scala - 如何在需要隐式参数的Scala中按名称实例化一个类?

我有一个这样声明的类:

在一个函数中,我使用类的名称(这里:className)来实例化类。

我试着这样做:

asSubclass classOf[Enricher]

但这仅在构造函数不需要任何参数时才有效。

我该怎么做?

0 投票
1 回答
258 浏览

scala - Scala应用方法调用作为括号与隐式参数冲突

Cay Horstmann 的《不耐烦的 Scala》一书中有一条关于 apply 方法的注释:

有时, () 符号会与另一个 Scala 特性发生冲突:隐式参数。例如,表达式会"Bonjour".sorted(3) 产生错误,因为可以选择使用排序调用 sorted 方法,但 3 不是有效的排序。

解决方案是分配"Bonjour".sorted给一个变量并对其调用 apply ,例如:

或显式调用 apply :

但是为什么这不起作用并产生编译错误:

sorted 方法返回 a String,它可以隐式转换为 a StringOps,括号用于包装字符串表达式。为什么编译器不接受调用 a 的 apply 方法StringOps