Mai*_*r00 11 functional-programming scala scala-2.10
我开始学习Scala,我很有趣,我可以在Scala中定义和使用没有任何类或对象的函数,就像Haskell中没有OOP概念一样.我有兴趣可以在没有任何OOP概念的情况下完全使用Scala吗?
PS我为Scala使用IntelliJ插件
Vla*_*eev 22
好吧,你不能真的那么做,但你可以通过使用包对象来非常接近:
src/main/scala/yourpackage/package.scala
:
package object yourpackage {
def function(x: Int) = x*x
}
Run Code Online (Sandbox Code Playgroud)
src/main/scala/yourpackage/Other.scala
:
package yourpackage
object Other {
def main(args: Array[String]) {
println(function(10)); // Prints 100
}
}
Run Code Online (Sandbox Code Playgroud)
注意如何function
在Other
对象中使用 - 没有任何限定符.这里function
属于一个包,而不属于某个特定的对象/类.
Tim*_*thy 11
正如其他答案所指出的那样,不能在没有对象或类的情况下定义函数,因为在Scala中,函数是对象,(例如)Function1
是一个类.
但是,可以定义没有封闭类或对象的函数.您可以通过将函数本身作为对象来完成此操作.
src/main/scala/foo/bar/square.scala
:
package foo.bar
object square extends (Int => Int) {
def apply(x: Int): Int = x * x
}
Run Code Online (Sandbox Code Playgroud)
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"
}
}
Run Code Online (Sandbox Code Playgroud)
不,作为“一流对象”起作用意味着它们仍然是对象。
但是,构造一个只调用任意组成的功能的Scala应用程序仍然很容易。
奥德斯基的一个模因是,Scala的FP和OOP的融合利用了OOP的模块化。Scala不为“纯FP”而努力,这是不言而喻的。但是OOP对日常编程会产生实际的影响,例如a Map
是a Function
,as是a Set
或a String
(由于丰富到StringOps
)。
因此,尽管可以编写仅调用一个函数而不进行OOPly结构化的程序,但从继承性和可变状态和副作用之类的其他非FP方面讲,该语言不支持主动避免OOP。