问题标签 [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.
scala - Scala 隐式自然变换,monad 无法找到用于理解的函数
我的代码是这样的:
并且 intellij 识别隐含,在编译时它无法解析 map 函数。有什么我明显做错了吗?
scala - scala 编译器是否对隐式类进行了优化?
假设我们有一个隐式类,例如:
我们可以使用 sayHello 方法,就好像它是在 String 类上定义的一样
scala 编译器是否将其优化为静态调用以避免构造 RichString 对象的开销?
scala - 嵌套类型的上下文绑定
是否有可能以某种方式创建为嵌套类型绑定的上下文?像这样的东西:
Ofc,这不是 Scala 语法,而是说明了我想要实现的目标,即在隐式U[List[T]]
. 这可能吗?
谢谢。
scala - 使用隐式见证组合类型级函数
我正在尝试一些相当复杂的类型级计算。在那里,我有一些类型标签(比如 、A
和B
)C
和处理它们的函数,它们由具有路径相关结果类型的隐式见证表示:
在计算的过程中,“实现”的时候Composed
,我需要利用我可以,给定上面的代码,原则上可以转换A
为C
(在这个例子中,我只需要组合,但实际上涉及的东西更多) .
但是,我不知道如何表达构图,因为我总是受到隐含不能传递的限制;以下代码因“未找到隐式”而失败:
我最初尝试写的是以下内容:
这当然失败了,因为我f1OfLast
在它定义的同一个参数列表中使用了它。如果它不是隐式参数,我可以写
但是不可能使用两个隐式参数列表来做到这一点,因为它们是语言不允许的。
简而言之:我怎样才能F2[F1[X]]
在上面的例子中得到证人?如有必要,我也可以改变编写类型级函数的方式,但我还没有找到另一种表达方式。
scala - 无形选择的无限递归[U]
我有一个巧妙的想法(嗯,这值得商榷,但假设我有一个想法)让 Scala 中的隐式依赖注入更容易。我遇到的问题是,如果您调用任何需要隐式依赖的方法,您还必须使用相同的依赖来装饰调用方法,一直到该具体依赖最终在范围内。我的目标是能够将特征编码为在将其混入具体类时需要一组隐式,因此它可以调用需要隐式的方法,但将它们的定义推迟到实现者。
显而易见的方法是使用某种 selftype 一个 la this psuedo-scala:
经过几次勇敢地尝试实际实现 atrait and[A,B]
以获得良好的语法后,我认为从 shapeless 开始并看看我是否能得到任何地方会更聪明。我降落在这样的事情上:
我不得不说,当它实际编译时,我非常兴奋。但是,事实证明,当你实际实例化 时,你会得到和MyImpl
之间的无限相互递归。MyImpl.provide
Required.provide
我认为这是由于我在 shapeless 上犯的一些错误的原因是,当我逐步完成时,它会到达那个select[T]
位置,然后进入 HListOps(有道理,因为 HListOps 是有select[T]
方法的)然后似乎反弹回来进入另一个呼叫Requires.provide
。
Selector[L,T]
我的第一个想法是它试图从中获取隐含provide
,因为provide
没有明确地防止这种情况发生。但,
- 编译器应该已经意识到它不会
Selector
退出provide
,要么选择了另一个候选者,要么编译失败。 - 如果我
provide
通过要求它接收隐式来保护Selector[L,T]
(在这种情况下,我可以只apply
得到)Selector
,T
那么由于 ,它不再编译diverging implicit expansion for type shapeless.ops.hlist.Selector[Int :: String :: HNil]
,我真的不知道如何进行寻址。
除了我的想法可能一开始就被误导的事实之外,我很想知道人们通常如何调试这些神秘的、细节的东西。任何指针?
scala - 隐式宏分辨率
我正在尝试获取由宏生成的隐式参数。隐式请求 StructTypeInfo 时,出现编译器错误,log-implicits 显示:
我编译它的方法是,如果我将它包装在一个参数化的类中:
这里有一些相关的代码(如果我遗漏了一些东西,请告诉我):
有趣的是,如果我materializeCaseClassSchemaType[MyCaseClass]
在隐式位置显式传递给函数,它就可以正常工作。为什么我需要包装器,我可以摆脱它吗?
scala - 如何将隐式值传递给函数?
我是新手scala
。我正在学习implicit variables
。如何将隐式变量传递给调用另一个将使用该变量的函数的函数。我知道这个问题看起来很愚蠢。看看我写的代码就知道了。
此代码不起作用。但这确实。
我想要这样的东西。
可能吗?
scala - Scala 隐式转换在某些条件下应用,但在其他条件下不应用
这是一个简单的复制器,我在其中定义了一个带有隐式重新排序转换的“可交换”对类型。f
如果函数的参数在预先存在的命名值中(t
在示例中),则编译器将按预期应用隐式转换。但是,如果我尝试f
直接调用 literal CommutativePair
,它会失败并出现类型错误。在这种情况下,编译器不会应用隐式重新排序转换。
scala - 不清楚为什么我的范围内隐式转换不被接受为“隐式证据”
我一直在尝试隐式转换,并且我对使用这些的“丰富我的图书馆”模式有一个不错的理解。我试图将我对基本隐含的理解与隐含证据的使用结合起来......但我误解了一些至关重要的东西,如下面的方法所示:
当我运行上述方法时,我收到此错误:
我很困惑,因为我会认为我的范围内隐式转换将是足够的“证据”,即 Int 可以转换为 FooInt,反之亦然。提前感谢您让我明白这一点!
更新:
在对下面彼得的出色回答感到困惑之后,灯泡亮了,这是您希望在 API 中使用隐式证据的一个很好的理由。我在我自己对这个问题的回答中详细说明了这一点(也在下面)。
scala - scala.js 示例应用程序中的“找不到隐式 ExecutionContext”错误。
以下是动手 Scala.js 电子书中的一个示例:
编译时出现错误:
这里出了什么问题?