Scala隐含解决的主要技术挑战是什么?

时间:2016-04-03 04:29:57

标签: scala implicit

在学习Scala时,我发现隐式的概念难以合理化。它允许一个人隐式传递值,而没有明确提到它们。

它的目的是什么,它试图解决的问题是什么?

3 个答案:

答案 0 :(得分:3)

在它的核心,implicit是一种以一种在程序的本地级别完全可控的方式扩展类型值的行为,并且在定义这些值的原始代码外部。这是解决expression problem的一种方法。

它可以让您的核心课程专注于他们最基本的结构和行为,并分析出更高级别的行为。它用于实现ad hoc多态,其中两个正式无关的数据类型可以无缝地适应同一个接口,因此可以将它们视为相同类型的实例。

例如,您可以将该行为存储在其他位置,而不是包含JSON序列化行为的数据模型类,并隐式增加一个能够序列化自身的对象。这等于在implicit实例中定义,该实例指定如何将对象视为“JSON可序列化”,而不是其原始类型,并且无需编辑对象的实际类型即可完成。

implicit有几种形式,pretty thoroughly covered elsewhere。用例包括enhance-my-library模式,类型类模式,隐式转换和依赖注入。

在这个问题的背景下,我真正感兴趣的是它与其他语言的方法有何不同。

增强我的库和类型类

在许多其他语言中,您可以通过猴子修补(通常没有类型检查的地方)或扩展方法来完成此操作。这些方法具有不可预测的构成和全球应用的缺点。在没有打开类的方式的静态类型语言中,您通常必须使用显式适配器。这有许多样板的缺点。在静态和动态语言中,您也可以使用反射,但通常会有很多仪式和复杂性。

在Haskell中,类型类作为一流的概念存在。但是,它们是全局的,因此您无法在特定情况下获得对类型类应用的本地控制。在Scala中,您可以通过导入的模块在本地控制范围内的implicits。并且您可以通过显式传递参数来完全选择退出隐式解决方案。

人们主张以某种方式解决类型问题的全局与局部解决方案,具体取决于你问的对象。

隐含转化

很多其他语言无法实现这一目标。但它在Scala中变得非常不受欢迎,所以也许这是有充分理由的。

答案 1 :(得分:1)

有一个paper about type classes older slidesdiscussion

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

Odersky回复了critique of implicits那个

  如果Scala没有隐式参数,那么Scala就不会是Scala   类。

这表明他们解决了对语言设计至关重要的挑战。换句话说,支持类型不是一个辅助问题。

答案 2 :(得分:-1)

这是一个非常深刻的问题它是非常强大的东西,你可以用它们来编写抽象代码,例如类型类等我可以推荐一些你可能会看到的教程,然后我们可以在某个时候聊聊天:) 这完全取决于在代码中提供合理的默认值。 在对象上调用显然不存在的方法的魔力似乎也起作用!所有这些好东西都是通过暗示完成的。 但是,尽管它的所有功能,它可能会导致人们编写一些非常糟糕的代码。 请在这里观看Nick Partridge的演讲,我相信如果你和他一起编码,你就会明白为什么以及如何处理暗示。 Watch it here

Dick Walls excellent presentation with live coding 观看两个部分。