问题标签 [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 回答
549 浏览

haskell - 隐式参数是 GHC 内联的困难吗?

我很好奇Kiselyov 和 Shan 在Function Pearl: Implicit Configurations文章 中讨论的对隐式参数的反对意见。

在存在隐式参数的情况下内联代码(β-reduce)是不合理的。

真的吗?我希望 GHC 应该内联到与传递的隐式参数相同的范围,不是吗?

我相信我理解他们的反对意见:

如果添加、删除或更改术语的签名,则术语的行为可能会发生变化。

GHC 的用户文档解释说,程序员必须注意多态递归单态限制。这是否是他们所说的内联问题的意思?

我认为这个多态递归示例也涵盖了“对隐式参数进行泛化”的含义?还要别的吗?

Data.Reflection中的ReifiesStorable类型类真的是解决这些困难的明智之选吗?它似乎在每次访问时都会反序列化整个隐式数据结构,这听起来对性能来说是灾难性的。例如,我们可能希望我们的隐含信息是 Cayley 表或字符表,它们占据了 ram,并且必须在数百万次代数运算期间访问。

是否有一些更好的解决方案使用隐式参数,或者编译器可以在幕后轻松优化的另一种技术,同时仍然通过使用状态线程或其他方式的类型系统保证更多?

0 投票
1 回答
350 浏览

scala - Scala:拦截函数以使用 Akka Futures 提供隐式参数

好的,所以我对返回 Akka Futures 的函数进行了一系列调用,并且我通过使用 flatMap 和 map 将它们链接起来,如下所示:

它可以分布在不同的函数调用中。现在每个 doAsyncCallX 调用都返回一个 Future[Result],我希望能够组合这些结果,将它们传递到链上,直到最后我可以返回链中所有结果的组合结果。

为此,我考虑让每个 doAsyncCallX 接收前一个结果的隐式参数,并将获得的结果与前一个结果结合起来。问题是,如果不使用像这样的隐式 val 乱扔我的库的使用,我就看不到这样做的方法:

我想做的是能够拦截 flatMap 的应用,以确保之前的响应作为下一个 doAsyncCallX 调用的隐式参数正确传递。关于如何做到这一点的任何想法?

0 投票
1 回答
325 浏览

haskell - 模板 Haskell 和隐式参数

有没有办法使用模板haskell创建带有隐式参数的函数或让带有隐式参数的绑定?

即是否可以使用模板haskell生成这样的签名:

或者像这样的调用:

在模板 haskell 的 API 文档中,我找不到合适的代数数据类型或任何可以帮助我解决此主题的函数。我正在使用 GHC 7.4.2。

如果在模板 haskell 中没有对这个扩展的原生支持,是否还有其他可能在编译期间注入代码(可能类似于模板 haskell 中的一般“代码注入功能”?)。

编辑:我尝试了评论中的建议,这就是发生的事情:

而这有效:

似乎不支持。

0 投票
2 回答
373 浏览

scala - 隐式值的隐式转换能否满足隐式参数?

我正在定义一些 Scala 隐式,以便更轻松地使用一组特定的不可更改的 Java 类。以下 Scala 代码是一个简化的示例,显然看起来很疯狂,在现实世界中,我试图从 Monkey、Tree 和 Duck 中隐式获取特定资源(而不是数字年龄),以用于各种方法,例如purchaseCandles()

编译器错误,发生 3 次:

抛开这个示例代码疯狂的许多不同方式,我真正的问题是:隐式值的隐式转换能否满足 Scala 中的隐式参数?

0 投票
1 回答
822 浏览

scala - Scala 中的隐式参数和 NullPointerException

我正在尝试定义一个函数,该函数接受一个整数和一个隐式对象,该对象具有处理该数字的代码,但我得到了一个,但NullPointerException我不知道为什么。如果我删除第一个println代码有效。

我定义隐式对象的方式有问题吗?

这是我的代码:

这是错误:

0 投票
2 回答
1856 浏览

scala - 如何在Scala中使用隐式参数扩展类

B类(隐含:Int)扩展AC { }

对象 C 扩展 B{

}

错误:找不到参数 imp 的隐式值

这就是我一直在寻找的:如何在类级别为隐式参数提供默认值

0 投票
2 回答
169 浏览

scala - Scala 捕获调用范围的所有隐式?

假设我有一个A定义了一些隐式值的范围,以及一个c使用这些隐式值的代码块。我也有B具有兼容类型隐含的范围,因此如果我将代码块复制cB中,它将毫无问题地编译和运行。当然,这很难看,因为我c在两个地方复制,所以我想c进入它自己的功能。现在, 的函数签名c必须如下所示:

implicitArgs使用的隐含值在哪里c。鉴于某些框架(在我的例子中是 Scalding)定义了许多隐式,这里的签名很快就会失控。是否有任何语法说“在调用范围内携带所有隐式值”?或者有没有聪明的方法来解决这个问题?

干杯,杰夫

0 投票
1 回答
46 浏览

grails - 如何在 where 闭包中引用隐式参数

如何在where闭包中使用隐式参数?

我对我目前的解决方法并不特别自豪:

我还注意到,我可以通过将通用 Groovy 代码放入闭包中来参数化查询,例如if上面的代码。奇怪的是,params里面的条件并没有造成任何麻烦,即使没有破解。这种做法可以还是不鼓励?

0 投票
1 回答
150 浏览

scala - 关于隐式参数的可读性

我的 DAO 类中处理文件夹的所有方法(Web 应用程序是关于云存储的,如谷歌驱动器)都将 User 作为第一个参数。使用此参数以便当前用户只能访问他或她拥有的文件夹。

一些例子:

等等。

有可能有一天我需要一种不需要用户参数的方法,但它仍然是少数。

正如您可能想象的那样,使用这些方法非常麻烦。

我确定了该问题的 3 个解决方案:

  1. 保持原样,因为可读性最重要
  2. 用户服务存储当前用户并且所有其他服务(和 DAO)都可以访问(这看起来像一个全局变量,但服务是可注入的,所以测试是可以的)
  3. 这些方法的隐式用户参数

带有隐式:

您认为这里最好的选择是什么?

这篇StackOverflow 帖子对这个问题提供了一些见解,但没有太大帮助,不幸的是

0 投票
1 回答
216 浏览

scala - 使用 Numeric[A] 类型的隐式参数似乎被忽略了

作为 Scala 的新手,我一直在玩fold,reducescan. 我想看看在函数参数上传递元素的顺序以及最终结果是如何组装的。由于我计划在数字和字符串列表中使用它,因此我使用类型参数定义了以下辅助函数:

Post Addition with generic type parameter in Scala提出了一个解决方案,重点是 + 方法应该需要一个数字类型来操作,所以在方法中添加一个类型为 Numeric[A] 的隐式参数应该可以解决问题。很遗憾:

[A:Numeric]用代替的语法(implicit n: Numeric[A])也不起作用......

编译上述帖子(下面的代码)中实现的单例对象“GenericTest”会导致相同的错误:“found: A, required: String”。

我在这里想念什么?

我正在使用 Scala 2.11.5