问题标签 [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 投票
1 回答
251 浏览

scala - Scala 隐式自然变换,monad 无法找到用于理解的函数

我的代码是这样的:

并且 intellij 识别隐含,在编译时它无法解析 map 函数。有什么我明显做错了吗?

0 投票
1 回答
219 浏览

scala - scala 编译器是否对隐式类进行了优化?

假设我们有一个隐式类,例如:

我们可以使用 sayHello 方法,就好像它是在 String 类上定义的一样

scala 编译器是否将其优化为静态调用以避免构造 RichString 对象的开销?

0 投票
1 回答
171 浏览

scala - 嵌套类型的上下文绑定

是否有可能以某种方式创建为嵌套类型绑定的上下文?像这样的东西:

Ofc,这不是 Scala 语法,而是说明了我想要实现的目标,即在隐式U[List[T]]. 这可能吗?

谢谢。

0 投票
1 回答
180 浏览

scala - 使用隐式见证组合类型级函数

我正在尝试一些相当复杂的类型级计算。在那里,我有一些类型标签(比如 、ABC和处理它们的函数,它们由具有路径相关结果类型的隐式见证表示:

在计算的过程中,“实现”的时候Composed,我需要利用我可以,给定上面的代码,原则上可以转换AC(在这个例子中,我只需要组合,但实际上涉及的东西更多) .

但是,我不知道如何表达构图,因为我总是受到隐含不能传递的限制;以下代码因“未找到隐式”而失败:

我最初尝试写的是以下内容:

这当然失败了,因为我f1OfLast在它定义的同一个参数列表中使用了它。如果它不是隐式参数,我可以写

但是不可能使用两个隐式参数列表来做到这一点,因为它们是语言不允许的。


简而言之:我怎样才能F2[F1[X]]在上面的例子中得到证人?如有必要,我也可以改变编写类型级函数的方式,但我还没有找到另一种表达方式。

0 投票
1 回答
283 浏览

scala - 无形选择的无限递归[U]

我有一个巧妙的想法(嗯,这值得商榷,但假设我有一个想法)让 Scala 中的隐式依赖注入更容易。我遇到的问题是,如果您调用任何需要隐式依赖的方法,您还必须使用相同的依赖来装饰调用方法,一直到该具体依赖最终在范围内。我的目标是能够将特征编码为在将其混入具体类时需要一组隐式,因此它可以调用需要隐式的方法,但将它们的定义推迟到实现者。

显而易见的方法是使用某种 selftype 一个 la this psuedo-scala:

经过几次勇敢地尝试实际实现 atrait and[A,B]以获得良好的语法后,我认为从 shapeless 开始并看看我是否能得到任何地方会更聪明。我降落在这样的事情上:

我不得不说,当它实际编译时,我非常兴奋。但是,事实证明,当你实际实例化 时,你会得到和MyImpl之间的无限相互递归。MyImpl.provideRequired.provide

我认为这是由于我在 shapeless 上犯的一些错误的原因是,当我逐步完成时,它会到达那个select[T]位置,然后进入 HListOps(有道理,因为 HListOps 是有select[T]方法的)然后似乎反弹回来进入另一个呼叫Requires.provide

Selector[L,T]我的第一个想法是它试图从中获取隐含provide,因为provide没有明确地防止这种情况发生。但,

  1. 编译器应该已经意识到它不会Selector退出provide,要么选择了另一个候选者,要么编译失败。
  2. 如果我provide通过要求它接收隐式来保护Selector[L,T](在这种情况下,我可以只apply得到) SelectorT那么由于 ,它不再编译diverging implicit expansion for type shapeless.ops.hlist.Selector[Int :: String :: HNil],我真的不知道如何进行寻址。

除了我的想法可能一开始就被误导的事实之外,我很想知道人们通常如何调试这些神秘的、细节的东西。任何指针?

0 投票
0 回答
168 浏览

scala - 隐式宏分辨率

我正在尝试获取由宏生成的隐式参数。隐式请求 StructTypeInfo 时,出现编译器错误,log-implicits 显示:

我编译它的方法是,如果我将它包装在一个参数化的类中:

这里有一些相关的代码(如果我遗漏了一些东西,请告诉我):

有趣的是,如果我materializeCaseClassSchemaType[MyCaseClass]在隐式位置显式传递给函数,它就可以正常工作。为什么我需要包装器,我可以摆脱它吗?

0 投票
2 回答
2624 浏览

scala - 如何将隐式值传递给函数?

我是新手scala。我正在学习implicit variables。如何将隐式变量传递给调用另一个将使用该变量的函数的函数。我知道这个问题看起来很愚蠢。看看我写的代码就知道了。

此代码不起作用。但这确实。

我想要这样的东西。

可能吗?

0 投票
1 回答
437 浏览

scala - Scala 隐式转换在某些条件下应用,但在其他条件下不应用

这是一个简单的复制器,我在其中定义了一个带有隐式重新排序转换的“可交换”对类型。f如果函数的参数在预先存在的命名值中(t在示例中),则编译器将按预期应用隐式转换。但是,如果我尝试f直接调用 literal CommutativePair,它会失败并出现类型错误。在这种情况下,编译器不会应用隐式重新排序转换。

0 投票
3 回答
83 浏览

scala - 不清楚为什么我的范围内隐式转换不被接受为“隐式证据”

我一直在尝试隐式转换,并且我对使用这些的“丰富我的图书馆”模式有一个不错的理解。我试图将我对基本隐含的理解与隐含证据的使用结合起来......但我误解了一些至关重要的东西,如下面的方法所示:

当我运行上述方法时,我收到此错误:

我很困惑,因为我会认为我的范围内隐式转换将是足够的“证据”,即 Int 可以转换为 FooInt,反之亦然。提前感谢您让我明白这一点!

更新:

在对下面彼得的出色回答感到困惑之后,灯泡亮了,这是您希望在 API 中使用隐式证据的一个很好的理由。我在我自己对这个问题的回答中详细说明了这一点(也在下面)。

0 投票
2 回答
22858 浏览

scala - scala.js 示例应用程序中的“找不到隐式 ExecutionContext”错误。

以下是动手 Scala.js 电子书中的一个示例:

编译时出现错误:

这里出了什么问题?