Scala 类型推理

Scala 类型推理

Scala类型推理使得指定变量的类型成为可有可无的事情,但类型不匹配的情况会被处理。有了类型推断功能,我们可以花更少的时间来写出编译器已经知道的东西。Scala编译器通常可以推断出一个表达式的类型,所以我们不必明确地声明它。让我们先来看看scala中如何声明不可变的变量的语法。

val variable_name : Scala_data_type = value

例子

// Scala program of type interference
object Geeks
{
   
    // Main method
    def main(args: Array[String])
    {
        // prints a double value
        val a : Double = 7.893
        println(a) 
        println(a.getClass)
         
    }
}

输出:

7.893
double

在上面的例子中,getClass方法被用来打印变量的类型到控制台。在上面的例子中,变量’a’的类型是double。然而,通过类型推理,Scala会自动检测变量的类型,而无需用户明确指定。

例子:

// Scala program of type interference
object Geeks {
 
    // Main method
    def main(args: Array[String])
    {
        // type inference
        println("Scala Data Types")
        val number = 5
        val big_number = 100000000L
        val small_number = 1
        val double_number = 2.50
        val float_number = 2.50f
        val string_of_characters = "This is a string of characters"
        val byte = 0xc
        val character = 'D'
        val empty = ()
         
        println(number)
        println(big_number)
        println(small_number)
        println(double_number)
        println(float_number)
        println(string_of_characters)
        println(byte)
        println(character)
        println(empty)
         
    }
}

输出:

Scala Data Types
5
100000000
1
2.5
2.5
This is a string of characters
12
D
()

请注意,上述变量没有明确指定数据类型。 Scala函数的类型推理 现在我们来看看Scala中函数的类型推理是如何进行的。首先让我们来看看Scala中的函数是如何声明的。

语法

 def function_name ([parameter_list]) : [return_type] = {

  // function body

}

例子 :

// Scala program of multiply two numbers
object Geeks
{
 
    // Main method
    def main(args: Array[String])
    {
         
        // Calling the function
        println("Product of the two numbers is: " + Prod(5, 3));
    }
     
     
    // declaration and definition of Product function
    def Prod(x:Int, y:Int) : Int =
    {
        return x*y
    }
}

输出:

Product of the two numbers is: 15

在上面的例子中,我们可以从声明中看到,指定的返回类型是Int。通过Scala类型推理,Scala会自动检测出函数的类型,而不需要用户明确指定。

例子:

// Scala program of type interference
object Geeks
{
 
    def factorial(n: Int)= {
         
        var f = 1
        for(i <- 1 to n)
        {
            f = f * i;
        }
         
        f
    }
 
    // Driver Code
    def main(args: Array[String])
    {
        println(factorial(5))
    }
 
}

输出:

120
def factorial(n: Int)= 

在上面的例子中,省略了冒号和返回类型。另外,在上面的例子中,我们省略了 “return f “到 “f “的语句,因为我们没有指定返回类型。如果把 “f “改为 “return f”,那么编译器会显示以下错误。

prog.scala:11: error: method factorial has return statement; needs result type
        return f
        ^

这显示了Scala类型推理的强大功能,但对于递归方法,编译器无法推断出结果类型。上述阶乘函数也可以以递归方式实现。下面是一个没有类型推理的阶乘函数的递归定义。

例子:

// Scala program of using recursion
object Geeks {
 
    // factorial function
    def factorial(n: Int): Int =
    {
        if (n == 0)
            return 1
        else
            return n * factorial(n-1)
    }
 
    // Driver Code
    def main(args: Array[String])
    {
        println(factorial(5))
    }
 
}

输出:

120

示例: 使用Scala类型推理

// Scala program of type interference
object Geeks
{
     
    // Defining function with type interference
    def factorial(n: Int) =
    {
        if (n == 0)
            1
        else
            n * factorial(n-1)
    }
 
    // Driver Code
    def main(args: Array[String])
    {
        println(factorial(5))
    }
 
}

输出

Compile Errors :
prog.scala:8: error: recursive method factorial needs result type
            n * factorial(n-1)
                ^

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程