【问题标题】:Why functional languages use objects for data types?为什么函数式语言使用对象作为数据类型?
【发布时间】:2018-05-31 13:07:40
【问题描述】:

我觉得大多数函数式语言,如 Kotlin 和 Scala,都倾向于将所有数据类型作为对象处理。

Double、Float、Long、Int.. 它们都是实际的对象,它们不提供任何原始替代方案?

为什么函数式语言偏爱对象? 仅仅是因为提供操作重载和多态更容易吗?或者这里面有什么更深层次的含义?

【问题讨论】:

  • A Kotlin Int 是 JVM int,原始类型
  • 除了我在下面的回答之外,我想指出 Scala 本质上是一种面向对象的语言。事实上,它比 Java 更面向对象,而它对函数式编程的支持与 Java 大致相同。区别主要在于避免突变和副作用的库的设计。您可以通过在不更改语言的情况下替换其标准库来使 Java 具有同样的功能。
  • Scala 确实 提供原始的 Ints、Double、Longs 等,但它非常小心地将其隐藏起来,并在必要时在后台进行所有装箱拆箱。 @JörgWMittag 我对此有点怀疑:如果 Java 的类型系统不支持更高种类的类型构造函数,你将如何在 Java 中表达类似 monad 转换器的东西?
  • @AndreyTyukin:scala.Int 在 JVM 上编译为原语这一事实是一个实现细节。这本质上就是我在回答中要表达的观点:您可以拥有对象并有效地编译它们,而无需拆分它们。您无法在 Java 中表达 monad 转换器的类型,但这并不意味着您无法实现它们。你也不能表达Monad 类型,但你仍然可以写单子。顺便说一句,我声称 Scala 不比 Java 更实用的说法是一种恭维。它看起来像它的事实,证明了 Odersky 在……方面的高品味。
  • Kotlin 不是函数式语言。

标签: scala functional-programming kotlin purely-functional


【解决方案1】:

这与函数式语言无关。事实上,几乎所有面向对象的语言都是如此。

人为地将值分成两种不同的东西只会造成复杂性,为什么你想要这样?

为数字对象的算术运算生成高效代码是完全可能的。事实上,大多数高性能 OO 实现生成处理原始本机机器号类型的代码,甚至是“对象号”。因此,如果您可以为两种情况生成相同的机器代码,但其中一种情况更简单,因为它没有这种人为分割,那么显然什么是更好的设计,不是吗?

现在,如果你想问我为什么 Java 的设计者会做出这个特别的选择,我不能告诉你。他们当然应该知道 Self 团队的工作,毕竟他们在 Sun 工作过。

【讨论】:

    猜你喜欢
    • 2013-04-05
    • 2010-10-21
    • 2013-05-19
    • 2021-09-24
    • 2014-08-26
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 1970-01-01
    相关资源
    最近更新 更多