【问题标题】:Other programming languages that support implicits "a la Scala"其他支持隐含“a la Scala”的编程语言
【发布时间】:2011-03-05 09:48:31
【问题描述】:

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

谢谢。

编辑

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

【问题讨论】:

  • 我认为你应该区分隐式方法和隐式值。我想很可能一种语言只支持其中一种。当然,两者兼有为进一步的可能性打开了大门,例如已经提到的“模拟类型类”解决方案,这实际上是它们的巧妙组合。
  • 我使用 implicits 这个词来指代隐式转换和隐式值/参数。我认为这是 Scala 上下文中的“正常”解释,但也许我错了。
  • @Daniel 非常感谢!我编辑了删除注释和您的消息的问题。再次感谢。

标签: programming-languages scala implicits


【解决方案1】:

看起来灵感来自 Haskell 的类型类。至少一篇博客文章声称implicits have their origin in Haskell type classes;这篇文章引用了 Martin Odersky 于 2006 年发表的一篇题​​为 Poor Man's Type Classes 的论文。 Daniel Sobral 最近写了一篇关于如何simulate type classes with implicits 的文章。

【讨论】:

  • 确实,让我印象更深的一件事是OrderingNumeric 中使用的type classes 的东西。感谢您的参考!
  • 隐式比类型类更通用。例如,您始终可以选择显式传递隐式参数,而不是让编译器为您填充它。而在 Haskell 中,类型类总是由编译器完成。
【解决方案2】:

在 2000 年编程语言原理 (POPL) 上有一篇非常好的论文,介绍了 implicit parameters。它们已在 Haskell 中实现。我确信 Scala 的设计师 Martin Odersky 知道这项工作。 (Martin 是 POPL 的频繁参与者和贡献者。)

【讨论】:

    【解决方案3】:

    另一个参考:"Type Classes as Objects and Implicits" (2010),作者 Bruno C. d. S. Oliveira、Adriaan Moors 和 Martin Odersky。

    通过此tweetre-tweet

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        如果我从http://patricklogan.blogspot.com/2007/06/scala-implicits.html 正确理解了隐含,那么是的,有几种语言支持它。

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

        我经常需要计算两个Points 之间的距离。 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);
        

        【讨论】:

        • Scala 隐式比 C# 扩展方法更强大。用 Odersky 的话 “[在 C# 中] 你只能向类添加方法,而不是字段或接口”。见这里artima.com/weblogs/viewpost.jsp?thread=179766
        • 我同意 @german1981,扩展方法是 Scala 隐式的用途之一,但它本身没有任何隐式机制。
        【解决方案6】:

        虽然不如 Scala 隐式强大,但 C++ 已经有了转换运算符和复制构造函数,它们都可能导致隐式类型转换。结合定义二元运算符的能力(这是 Scala 不允许的),这提供了 Scala 隐式的一些功能。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-02-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-08
          • 1970-01-01
          • 2018-01-24
          相关资源
          最近更新 更多