什么是Scala';s";“强有力的”;类型系统?

什么是Scala';s";“强有力的”;类型系统?,scala,types,Scala,Types,在讨论Scala时,类型系统总是作为主要特性之一被提到。它被称为强大的,并且是语言命名对象(Scala是“可伸缩语言”的缩写)的主要原因。有人能解释一下Scala类型是如何工作的/为什么是这种独特的,以及它是如何促进语言的可伸缩性的吗?我不知道你是否懂Java,但想象一下Scala的类型系统是这样的: 消除Java对类型和泛型的人为限制 向其中添加函数式语言的通用特性 在面向对象/继承方面进行创新 我想再多写一点,但我的键盘坏了,对不起 Scala类型系统与Java类型系统相比的一些优势:

在讨论Scala时,类型系统总是作为主要特性之一被提到。它被称为强大的,并且是语言命名对象(Scala是“可伸缩语言”的缩写)的主要原因。有人能解释一下Scala类型是如何工作的/为什么是这种独特的,以及它是如何促进语言的可伸缩性的吗?

我不知道你是否懂Java,但想象一下Scala的类型系统是这样的:

  • 消除Java对类型和泛型的人为限制
  • 向其中添加函数式语言的通用特性
  • 在面向对象/继承方面进行创新

我想再多写一点,但我的键盘坏了,对不起

Scala类型系统与Java类型系统相比的一些优势:

  • 在许多情况下,可以推断类型,而不是显式指定类型。这更方便,但它促进了复杂类型的使用

    val map=newmap[String,(String,String)]()

    而不是

    Map=newhashmap()

  • 函数可以在类型系统中简单地表示。如果你想知道这有多强大,请考虑一下GAVA库作为java的工作。这是难以置信的约束和冗长(但仍然有用)

    val-double=(x:Int)=>x*2

    而不是(用番石榴)

    Function double=new Function(){@Override public Integer apply(整数值){返回值*2;}}}

  • 元组是Scala中的一种类型,避免了Java只能返回单个值的问题

  • Scala支持类型,因此当Cat是事物的子类型时(或者当反向关系成立时),可以指定SomeObject是SomeObject的子类型。在java中,这通常是有问题的

  • Scala支持有限形式的多重继承,使用。与接口(其中多个可以用Java实现)不同,traits可以定义方法和变量

  • 数组的处理与任何其他类一样透明

  • 可以通过隐式定义进行添加。例如,您可以向整数数组添加“sum”方法

    class IntArray(value: Array[Int]) { def sumIt = value.reduceRight(_+_) }
    implicit def pimpArray(xs: Array[Int]) = new IntArray(xs)
    Array(1,2,3).sumIt
    

  • 这是上面一些主题的另一个很好的资源:

    除了schmmd的优秀答案之外,Scala的类型系统还有更重要的功能:

    • 对象
      s是Java中
      静态
      成员变量和方法的干净替代品,例如
      对象
      有自己的类型,可以作为参数传递
    • type
      声明:您可以为复杂的类型定义别名,例如
      type FactorMap[A]=Map[A,Set[Int]
    • 抽象类型成员作为泛型样式类型的替代
    • 自我类型
    • 结构类型
    • 用于curry的多个参数列表
    • 隐式参数和转换,以及视图边界。这导致了“pimpmylibrary”模式,可以用来模拟Haskell风格的类型类
    • 高阶类型
    最后一点是我最喜欢的。例如,不能用Java编写简单的通用函子接口。你需要


    我认为现有的答案不合适。Scala有很多便利之处,但它们与强大的类型系统无关,因为它们与类型有关。事实上,类型推理与类型系统的功能直接冲突——如果它功能较弱,则可以进行完整的类型推理(如Haskell)

    所以

    • Scala有包含成员的类。(很明显,但我在这里尽量详尽。)
    • scala类的方法(“def”)成员可以有零个或多个参数列表,每个参数列表可以有零个或多个参数,最后一个参数可能是vararg
    • 参数可以通过值或名称传递
    • 参数具有名称,并且可能具有默认值
    • Scala有“var”和“val”成员(实际上也是方法)
    • Scala有“lazy val”成员
    • Scala有“类型”成员(类型别名),可以指定为固定类型或类型边界
    • Scala有抽象类和成员(上面所有的成员都可能是抽象的)
    • Scala有内部类、特征和对象(Scala的内部类与Java的不同)
    • Scala的成员以及内部内容可能会被覆盖
    • Scala具有类型继承
    • Scala具有一些特性,通过类型线性化提供多重继承
    • Scala的traits的方法成员可能具有抽象覆盖(可堆叠、类方面覆盖)
    • Scala有单例类型
    • Scala有附带的类/对象(与作用域相关)
    • Scala为类、特征、单例和成员提供私有、受保护和公共作用域
    • Scala的私有和受保护的作用域可以限制为任何封闭包、类、trait或singleton,加上“this”
    • Scala有自己的类型
    • Scala有类型参数
    • Scala的类型参数可以是协变和逆变,也可以是不变的
    • Scala有类型构造函数
    • Scala具有高阶类型
    • Scala有存在类型
    • Scala有结构类型
    • Scala具有隐式参数
    • 不过Scala有函数类型,因为它们只是一个类加上语法糖,我认为它不属于这个列表。另一方面,函数类型是视图边界的一部分,所以它可能是
    • Scala有一个顶部(和几乎所有人一样)和一个底部(和其他静态类型的fp语言一样)
    • Scala的“unit”是一个带有值的类型(与其他地方的“void”相反)
    接下来,还有一些与Scala的隐式相关的特性,这正是它们应该包含在上面的地方

    • Scala有视图边界,这是一个隐式参数,作用类似于另一个类型边界
    • 斯卡拉
      public interface Function<A,B> {
         public B apply(A a);
      }
      
      //not valid Java
      public interface Functor<C> {
         public <A,B> C<B> map(Function<A,B> fn, C<A> ca);
      }
      
      trait Functor[C[_]] {
         def map[A,B](fn: A => B, ca: C[A]):C[B]
      }
      
      object ListFunctor extends Functor[List] {
         def map[A,B](fn: A => B, ca: List[A]):List[B] = ca.map(fn)
      }