【问题标题】:Do any general purpose languages support n + 2 = 3 and beyond?是否有任何通用语言支持 n + 2 = 3 及以上?
【发布时间】:2011-12-21 23:01:08
【问题描述】:

是否支持任何通用语言,例如:

n + 2 = 3;

确保“n”现在可能读作 1,或者在其他情况下读作有点但并非完全不确定的值。

除此之外,还有任何可以支持这个概念的算法东西,例如字符串和数字与连接、子字符串、数字按位旋转等概念的混合......不是因为somone将它硬编码到语言,但因为语言了解如何使用它了解事物如何工作的知识(您的 C++ 样式类、您的无类脚本语言,如对象、存在的函数等......)并使用这些知识重新排列事物,这在代数中很常见。

【问题讨论】:

  • 这是一个不应该出现在语言中的坏特性。 Haskell 有 n+k 模式,但没有人喜欢它们。
  • 阅读这篇文章会有所帮助:stackoverflow.com/questions/580356/…
  • Pubby,是 n + k 模式仅与加法有关,或者它们是否允许任何此类关系。第一个答案似乎是说只有 Prolog 可以做这种事情。
  • @Pubby:Haskell 不再支持 n+k 模式(截至 2010 年)。

标签: function math object programming-languages abstraction


【解决方案1】:

我猜只有 Prolog 可以做这种事情(只计算众所周知的编程语言)。

【讨论】:

  • 你能指出我在 prolog 中显示模拟抽象(例如数据结构)的任何内容吗(尽管 ofc 问题必须解析为布尔值)
  • 我相信逻辑编程语言通常可以做到这一点(Prolog 是一种逻辑编程语言)。尽管有些人(少数人)可能不同意,但逻辑编程语言在很大程度上并不被认为是“通用的”。由于回溯等原因,用逻辑语言执行一些(甚至是简单的)计算的最佳方法需要组合上不合理的子计算。这并不是说它们没有自己的位置,而是在某些情况下它们的效率相对较低。
【解决方案2】:

当然:如果我没记错的话,Algol 60 声称支持这种特殊情况(不确定.. 已经有一段时间了 :) 但是只有简单的线性情况,这没有用,因为它很容易从中减去常数两边都在你的脑海里。

然而,许多现代语言在其类型系统方面给编译器带来了非常难以解决的问题。许多允许提出具有解决方案但编译器无法解决的类型问题,对于进行类型推断的编译器尤其如此。

【讨论】:

    【解决方案3】:

    Haskell 所谓的“n-plus-k”模式,例如,您可以将阶乘函数编写为:

    fac 0     =  1
    fac (n+1) = (n+1) * fac n
    

    这现在被视为一个坏主意(一些 reasons here),并已从语言规范中删除(在 Haskell98 中已弃用,在 Haskell2010 中已删除)。但! Haskell 的未来版本正在开发一种更复杂、更通用的形式:

    View Patterns -- 参见“N+K 模式”部分

    【讨论】:

      【解决方案4】:

      通用语言被称为通用语言是有原因的。你不能用它们解决数学问题。

      我所知道的所有 GP 语言都不允许在赋值左侧使用表达式。 Erlang 有模式匹配,但那是完全不同的东西。

      【讨论】:

      • 我问题的后半部分就是关于这个。我说的是关于安排事物的代数推理,尽管在给定示例中的幕后可以而且也许已经完成了任何事情,而不仅仅是数学中使用的类型。例如 OO 编程中的对象与操作用户,而不仅仅是语言设计者指定的对象。
      • 恐怕我没听懂你刚才说的话。对不起,我是认真的。另外,我回答的前半部分就是这样:编程时不要使用代数方法。这样做(无论该语言是否适合)会导致令人难以置信的膨胀和复杂性。 n + x = y 是人为的问题。计算机需要知道的是 n = y - x。如果你知道,为什么不这样编码。如果您不这样做,请首先尝试了解希望计算机做什么,而不是试图让计算机解决人类问题(通常很难解决)。
      • 你知道声明式编程这样的概念吗? en.wikipedia.org/wiki/Declarative_programming “许多应用这种风格的语言试图通过描述程序应该完成什么来最小化或消除副作用,而不是描述如何去完成它。”许多函数式语言都使用这种方法。
      • 我相信你可以理解 num1.add(num2) 和 num1 + num2 可能是等价的,但是还有许多其他的数学运算不是相同的方式,例如 string1.substring( 4, 2) 或 node.add_parent(p) 但相同的原则可以适用于重新排列。
      • "n + x = y" 不是“程序应该完成什么”,而是“程序必须解决什么问题”。不完全一样。
      猜你喜欢
      • 1970-01-01
      • 2010-09-17
      • 1970-01-01
      • 2017-08-03
      • 1970-01-01
      • 2016-10-22
      • 1970-01-01
      • 1970-01-01
      • 2013-10-26
      相关资源
      最近更新 更多