问题标签 [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.
haskell - 隐式参数是 GHC 内联的困难吗?
我很好奇Kiselyov 和 Shan 在Function Pearl: Implicit Configurations文章 中讨论的对隐式参数的反对意见。
在存在隐式参数的情况下内联代码(β-reduce)是不合理的。
真的吗?我希望 GHC 应该内联到与传递的隐式参数相同的范围,不是吗?
我相信我理解他们的反对意见:
如果添加、删除或更改术语的签名,则术语的行为可能会发生变化。
GHC 的用户文档解释说,程序员必须注意多态递归和单态限制。这是否是他们所说的内联问题的意思?
我认为这个多态递归示例也涵盖了“对隐式参数进行泛化”的含义?还要别的吗?
Data.Reflection中的ReifiesStorable
类型类真的是解决这些困难的明智之选吗?它似乎在每次访问时都会反序列化整个隐式数据结构,这听起来对性能来说是灾难性的。例如,我们可能希望我们的隐含信息是 Cayley 表或字符表,它们占据了 ram,并且必须在数百万次代数运算期间访问。
是否有一些更好的解决方案使用隐式参数,或者编译器可以在幕后轻松优化的另一种技术,同时仍然通过使用状态线程或其他方式的类型系统保证更多?
scala - Scala:拦截函数以使用 Akka Futures 提供隐式参数
好的,所以我对返回 Akka Futures 的函数进行了一系列调用,并且我通过使用 flatMap 和 map 将它们链接起来,如下所示:
它可以分布在不同的函数调用中。现在每个 doAsyncCallX 调用都返回一个 Future[Result],我希望能够组合这些结果,将它们传递到链上,直到最后我可以返回链中所有结果的组合结果。
为此,我考虑让每个 doAsyncCallX 接收前一个结果的隐式参数,并将获得的结果与前一个结果结合起来。问题是,如果不使用像这样的隐式 val 乱扔我的库的使用,我就看不到这样做的方法:
我想做的是能够拦截 flatMap 的应用,以确保之前的响应作为下一个 doAsyncCallX 调用的隐式参数正确传递。关于如何做到这一点的任何想法?
haskell - 模板 Haskell 和隐式参数
有没有办法使用模板haskell创建带有隐式参数的函数或让带有隐式参数的绑定?
即是否可以使用模板haskell生成这样的签名:
或者像这样的调用:
在模板 haskell 的 API 文档中,我找不到合适的代数数据类型或任何可以帮助我解决此主题的函数。我正在使用 GHC 7.4.2。
如果在模板 haskell 中没有对这个扩展的原生支持,是否还有其他可能在编译期间注入代码(可能类似于模板 haskell 中的一般“代码注入功能”?)。
编辑:我尝试了评论中的建议,这就是发生的事情:
而这有效:
似乎不支持。
scala - 隐式值的隐式转换能否满足隐式参数?
我正在定义一些 Scala 隐式,以便更轻松地使用一组特定的不可更改的 Java 类。以下 Scala 代码是一个简化的示例,显然看起来很疯狂,在现实世界中,我试图从 Monkey、Tree 和 Duck 中隐式获取特定资源(而不是数字年龄),以用于各种方法,例如purchaseCandles()
:
编译器错误,发生 3 次:
抛开这个示例代码疯狂的许多不同方式,我真正的问题是:隐式值的隐式转换能否满足 Scala 中的隐式参数?
scala - Scala 中的隐式参数和 NullPointerException
我正在尝试定义一个函数,该函数接受一个整数和一个隐式对象,该对象具有处理该数字的代码,但我得到了一个,但NullPointerException
我不知道为什么。如果我删除第一个println
代码有效。
我定义隐式对象的方式有问题吗?
这是我的代码:
这是错误:
scala - Scala 捕获调用范围的所有隐式?
假设我有一个A
定义了一些隐式值的范围,以及一个c
使用这些隐式值的代码块。我也有B
具有兼容类型隐含的范围,因此如果我将代码块复制c
到B
中,它将毫无问题地编译和运行。当然,这很难看,因为我c
在两个地方复制,所以我想c
进入它自己的功能。现在, 的函数签名c
必须如下所示:
中implicitArgs
使用的隐含值在哪里c
。鉴于某些框架(在我的例子中是 Scalding)定义了许多隐式,这里的签名很快就会失控。是否有任何语法说“在调用范围内携带所有隐式值”?或者有没有聪明的方法来解决这个问题?
干杯,杰夫
grails - 如何在 where 闭包中引用隐式参数
如何在where
闭包中使用隐式参数?
我对我目前的解决方法并不特别自豪:
我还注意到,我可以通过将通用 Groovy 代码放入闭包中来参数化查询,例如if
上面的代码。奇怪的是,params
里面的条件并没有造成任何麻烦,即使没有破解。这种做法可以还是不鼓励?
scala - 关于隐式参数的可读性
我的 DAO 类中处理文件夹的所有方法(Web 应用程序是关于云存储的,如谷歌驱动器)都将 User 作为第一个参数。使用此参数以便当前用户只能访问他或她拥有的文件夹。
一些例子:
等等。
有可能有一天我需要一种不需要用户参数的方法,但它仍然是少数。
正如您可能想象的那样,使用这些方法非常麻烦。
我确定了该问题的 3 个解决方案:
- 保持原样,因为可读性最重要
- 用户服务存储当前用户并且所有其他服务(和 DAO)都可以访问(这看起来像一个全局变量,但服务是可注入的,所以测试是可以的)
- 这些方法的隐式用户参数
带有隐式:
您认为这里最好的选择是什么?
这篇StackOverflow 帖子对这个问题提供了一些见解,但没有太大帮助,不幸的是
scala - 使用 Numeric[A] 类型的隐式参数似乎被忽略了
作为 Scala 的新手,我一直在玩fold
,reduce
和scan
. 我想看看在函数参数上传递元素的顺序以及最终结果是如何组装的。由于我计划在数字和字符串列表中使用它,因此我使用类型参数定义了以下辅助函数:
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