Scala implicits非常强大。我很好奇它们是Scala的一个新的/独特的功能,还是已经存在于其他编程语言中的概念。
感谢。
修改:
澄清我的问题,是的,我正在谈论这个具体的实施。一开始有“含蓄的东西”似乎很奇怪,但是已经使用了一段时间并看到别人如何使用它,我对它的工作效果印象深刻。
答案 0 :(得分:14)
看起来灵感来自Haskell的类型类。至少有一篇博客文章声称implicits have their origin in Haskell type classes;该文引用Martin Odersky于2006年发表的题为Poor Man's Type Classes的论文。 Daniel Sobral最近写了一篇关于如何simulate type classes with implicits的文章。
答案 1 :(得分:5)
2000年,Princples of Programming Lanages(POPL)发表了一篇非常好的论文,其中介绍了implicit parameters。它们已在Haskell中实现。我确信Scala的设计师Martin Odersky知道这项工作。 (马丁是POPL的常客和欢迎参与者。)
答案 2 :(得分:2)
另一个参考:"Type Classes as Objects and Implicits"(2010),Bruno C. d。 S. Oliveira,Adriaan Moors和Martin Odersky。
答案 3 :(得分:1)
这取决于您希望扩展“支持隐含”这一短语的范围。 Scala中隐含的一个令人信服的原因是基本上将方法添加到现有类(您无权访问)。通过不同的结构可以在其他语言中实现这一点:例如,Smalltalk,Ruby和Objective-C都支持向不能控制的类添加方法。
答案 4 :(得分:1)
如果我理解正确地从http://patricklogan.blogspot.com/2007/06/scala-implicits.html隐含,那么肯定有几种语言支持它。
最好的例子是C#扩展方法。我最近使用它们的一个例子:
我经常不得不在两个Point
之间进行距离计算。 Point
无法计算到另一个点的距离,因此我将以下代码添加到我的项目中:
class MyPointExtension
{
public static Double GetDistance(this Point p1, Point p2)
{
return /* the pythagoras code */
}
}
然后我可以这样做:
Point unitPosition = new Point(x,y);
Point target = new Point(x2,y2);
Double distance = unitPosition.GetDistance(target);
答案 5 :(得分:1)
虽然没有Scala那么强大,但是C ++已经有了转换操作符和复制构造函数,这些都可能导致隐式类型转换。结合定义二元运算符的能力(Scala不允许),这提供了Scala隐含的一些功能。