14

I begin to learn Scala and I'm interesting can I define and use function without any class or object in Scala as in Haskell where there is no OOP concept. I'm interested can I use Scala totally without any OOP concept?

P.S. I use IntelliJ plugin for Scala

4

3 回答 3

26

好吧,你不能真正做到这一点,但你可以通过使用包对象非常接近:

src/main/scala/yourpackage/package.scala

package object yourpackage {
  def function(x: Int) = x*x
}

src/main/scala/yourpackage/Other.scala

package yourpackage

object Other {
  def main(args: Array[String]) {
    println(function(10));   // Prints 100
  }
}

请注意如何functionOther对象中使用 - 没有任何限定符。这里function属于一个包,而不是某个特定的对象/类。

于 2013-09-01T07:28:48.403 回答
20

正如其他答案所表明的那样,不可能在没有对象或类的情况下定义函数,因为在 Scala 中,函数是对象并且(例如)Function1是类。

但是,可以定义一个没有封闭类或对象的函数。您可以通过使函数本身成为对象来做到这一点。

src/main/scala/foo/bar/square.scala

package foo.bar

object square extends (Int => Int) {
  def apply(x: Int): Int = x * x
}

extends (Int => Int)在这里只是语法糖extends Function1[Int, Int]

然后可以像这样导入和使用它:

src/main/scala/somepackage/App.scala

package foo.bar.somepackage

import foo.bar.square

object App {
  def main(args: Array[String]): Unit = {
    println(square(2))  // prints "4"
  }
}
于 2016-08-19T04:35:47.513 回答
6

不,作为“一等对象”的功能意味着它们仍然是对象。

但是,构建一个除了调用任意组合的函数之外什么都不做的 Scala 应用程序仍然很容易。

Odersky 的一个迷因是 Scala 对 FP 和 OOP 的融合利用了 OOP 的模块化。Scala 并不追求“纯 FP”,这是不言而喻的。但是 OOP 对日常编程有真正的影响,例如 aMap是 a Function, a 是 aSet或 a String(通过丰富 to StringOps)。

因此,尽管可以编写一个仅调用函数而不是结构化 OOP 的程序,但该语言不支持主动避免 OOP,因为它会暴露于继承和其他 unFP 事物(如可变状态和副作用)。

于 2013-08-31T14:27:12.047 回答