Scala';什么是隐式解决方案?

Scala';什么是隐式解决方案?,scala,implicit,Scala,Implicit,在学习Scala时,我发现内隐的概念很难合理化。它允许隐式地传递值,而不显式地提及它们 它的目的是什么?它要解决的问题是什么?这是一个很深的问题,它真的很强大,你可以用它来编写抽象代码,例如TypeClass等。我可以推荐一些教程,你可以看看,然后我们可以在某个时候聊一聊:) 这一切都是关于在代码中提供合理的默认值。 还有,在对象上调用显然不存在的方法的魔力,而这些方法似乎是有效的!所有这些好东西都是通过隐式完成的。 但尽管它的强大功能,它也可能导致人们编写一些非常糟糕的代码。 请务必观看Nic

在学习Scala时,我发现内隐的概念很难合理化。它允许隐式地传递值,而不显式地提及它们


它的目的是什么?它要解决的问题是什么?

这是一个很深的问题,它真的很强大,你可以用它来编写抽象代码,例如TypeClass等。我可以推荐一些教程,你可以看看,然后我们可以在某个时候聊一聊:) 这一切都是关于在代码中提供合理的默认值。 还有,在对象上调用显然不存在的方法的魔力,而这些方法似乎是有效的!所有这些好东西都是通过隐式完成的。 但尽管它的强大功能,它也可能导致人们编写一些非常糟糕的代码。 请务必观看Nick Partridge在这里的演示,我相信如果您与他一起编写代码,您将理解为什么以及如何处理隐式。

两部分都看

有一个带和的

能够隐式传递对类型类进行编码的对象简化了样板

奥德斯基刚刚回答了一个问题

如果Scala没有隐式参数和 上课


这表明他们解决了语言设计的核心问题。换句话说,支持类型类不是一个辅助问题。

其核心是,
隐式
是一种扩展类型值行为的方法,该方法在程序的本地级别上完全可控,并且在定义这些值的原始代码之外。这是解决问题的一种方法

它可以让您的核心类专注于最基本的结构和行为,并考虑更高级别的行为。它用于实现特殊多态性,其中两种形式上不相关的数据类型可以无缝地适配到同一接口,以便将它们视为同一类型的实例

例如,与包含JSON序列化行为的数据模型类不同,您可以将该行为存储在其他位置,并隐式地增加对象自身序列化的能力。这相当于在
隐式
实例中定义,该实例指定如何将对象视为“JSON可序列化”,而不是其原始类型,并且不编辑对象的实际类型

有几种形式的
隐式
,它们是。用例包括增强我的库模式、类型类模式、隐式转换和依赖注入

在这个问题的上下文中,我真正感兴趣的是,这与其他语言中的方法有何不同

增强我的库和类型类

在许多其他语言中,可以通过monkey补丁(通常在没有类型检查的情况下)或扩展方法来实现这一点。这些方法的缺点是不可预测的组合和全球应用。在没有打开类方法的静态类型语言中,通常必须创建显式适配器。这有很多样板的缺点。在静态和动态语言中,您也可以使用反射,但通常会有很多仪式和复杂性

在Haskell中,类型类作为一级概念存在。但是,它们是全局的,所以在给定的情况下,您无法获得对应用什么类型类的本地控制。在Scala中,您可以通过导入的模块本地控制作用域中的隐式。通过显式地传递参数,您始终可以选择完全退出隐式解析

人们主张以一种或另一种方式对类型类进行全局或局部解析,这取决于你问谁

隐式转换


很多其他语言都没有办法做到这一点。但在Scala中,这已经变得非常不受欢迎,所以也许这是有理由的。

他们需要离开地面。天哪,我不知道Scala有多少谜题。这个问题有很多不好的答案,但也有好的和简洁的答案。我同意。这是一个宽泛的问题,但这是一个重要的问题,也不太宽泛,IMO。这篇文章的另一个重要特点是脚注显示了Adriaan Moors的存储库的哪个分支需要检查,以便示例在
-Xexperimental
下编译。我很了解类型类和Haskell,但是我看不到隐式类和类型类之间的联系。@Ana:那么你应该读一读论文“”,这篇文章很好地解释了这一点。要点是:您知道GHC在实现类型类时是如何传递隐藏的方法字典的吗?嗯,“传递”部分是通过隐式实现的,除了对象之外,什么是“方法字典”?@Ana:还有一句很好的引语:“隐式看起来越来越不像“穷人的类型类”,而且越来越像是对类型类的改进,在我看来,只要快速阅读本文。”@JörgWMittag谢谢我午夜的回答太懒了。这是权宜之计。另一个答案提到隐式作用域支持类型类选择;该报称之为“缺失环节”。我不清楚引入隐式技术是为了解决这一“技术挑战”,还是作为一种解决方案出现。为什么投反对票?嗯,不管怎么说。我猜否决票是因为答案不应该引用场外资源来提供答案。答案应该是概括的。另外,你的答案不支持隐含的“合理默认值”是“主要的技术挑战”。默认参数不提供合理的默认值吗?嗯,明白了。届时将更新更多信息。:)谢谢回复。