Programming languages 支持隐式ITS的其他编程语言;“斯卡拉酒店”;

Programming languages 支持隐式ITS的其他编程语言;“斯卡拉酒店”;,programming-languages,scala,implicits,Programming Languages,Scala,Implicits,Scala的功能非常强大。我很好奇它们是Scala的一个新的/独特的特性,还是其他编程语言中已经存在的概念 谢谢 编辑: 为了澄清我的问题,是的,我正在谈论这个具体的实现。一开始,到处都是“隐含的东西”似乎很奇怪,但使用了一段时间,看到别人如何使用它,我对它的效果印象深刻。这取决于你想把“支持隐含”这个短语延伸到多大的范围。Scala中隐式的一个令人信服的原因是本质上向现有类(您无权访问)添加方法。在其他语言中,这可以通过不同的构造实现:例如,Smalltalk、Ruby和Objective-C

Scala的功能非常强大。我很好奇它们是Scala的一个新的/独特的特性,还是其他编程语言中已经存在的概念

谢谢

编辑


为了澄清我的问题,是的,我正在谈论这个具体的实现。一开始,到处都是“隐含的东西”似乎很奇怪,但使用了一段时间,看到别人如何使用它,我对它的效果印象深刻。

这取决于你想把“支持隐含”这个短语延伸到多大的范围。Scala中隐式的一个令人信服的原因是本质上向现有类(您无权访问)添加方法。在其他语言中,这可以通过不同的构造实现:例如,Smalltalk、Ruby和Objective-C都支持向不受控制的类添加方法。

如果我从那时起正确理解隐式,那么是的,有几种语言支持隐式

最好的例子是C#扩展方法。我最近使用它们的一个例子:

我经常不得不计算两个
点之间的距离。
没有计算到另一点距离的方法,因此我在项目中添加了以下代码:

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);

看起来灵感来自Haskell的类型课程。至少有一篇博客文章声称:;这篇文章引用了马丁·奥德斯基2006年的一篇论文,题为。Daniel Sobral最近写了一篇关于如何.< /p> < p>的文章,虽然没有Scala那么强大,但是C++已经有了转换操作符和复制构造函数,它们都可以导致隐式类型转换。结合定义二进制运算符(Scala不允许的)的能力,这提供了Scala隐含的一些功能。

2000年在编程语言原则(Princples of Programming Lanages,POPL)上有一篇非常好的论文,介绍了。它们已经在Haskell中实现。我相信Scala的设计师Martin Odersky知道这项工作。(Martin是POPL的常客和受欢迎的参与者和贡献者。)

另一篇参考文献:(2010),由Bruno C.d。奥利维拉、阿德里安·摩尔和马丁·奥德斯基


通过这个和。

我认为您应该区分隐式方法和隐式值。我想很可能一种语言只支持其中一种。当然,两者都为进一步的可能性打开了大门,比如前面提到的“类型类模拟”解决方案,它实际上是它们的巧妙组合。我用implicits这个词来指隐式转换和隐式值/参数。我认为这是Scala上下文中的“正常”解释,但也许我错了。@Daniel非常感谢!我编辑了问题,删除了便条和您的邮件。再次感谢。Scala隐式方法比C#扩展方法更强大。用奥德斯基的话来说,“[在C#]中,只能向类添加方法,而不能向类添加字段或接口”。在这里我同意@german1981,扩展方法是Scala隐式的一种用途,但它本身没有隐式的机制。事实上,给我印象最深的一件事是
排序中使用的类型类和
数值
。谢谢你的推荐!不过,隐式类比类型类更通用。例如,您总是可以选择显式地传递隐式参数,而不是让编译器为您填充它。而在Haskell中,类型类总是由编译器完成的。