什么是Scala';s";“强有力的”;类型系统?
在讨论Scala时,类型系统总是作为主要特性之一被提到。它被称为强大的,并且是语言命名对象(Scala是“可伸缩语言”的缩写)的主要原因。有人能解释一下Scala类型是如何工作的/为什么是这种独特的,以及它是如何促进语言的可伸缩性的吗?我不知道你是否懂Java,但想象一下Scala的类型系统是这样的:什么是Scala';s";“强有力的”;类型系统?,scala,types,Scala,Types,在讨论Scala时,类型系统总是作为主要特性之一被提到。它被称为强大的,并且是语言命名对象(Scala是“可伸缩语言”的缩写)的主要原因。有人能解释一下Scala类型是如何工作的/为什么是这种独特的,以及它是如何促进语言的可伸缩性的吗?我不知道你是否懂Java,但想象一下Scala的类型系统是这样的: 消除Java对类型和泛型的人为限制 向其中添加函数式语言的通用特性 在面向对象/继承方面进行创新 我想再多写一点,但我的键盘坏了,对不起 Scala类型系统与Java类型系统相比的一些优势:
- 消除Java对类型和泛型的人为限制
- 向其中添加函数式语言的通用特性
- 在面向对象/继承方面进行创新
我想再多写一点,但我的键盘坏了,对不起 Scala类型系统与Java类型系统相比的一些优势:
val map=newmap[String,(String,String)]()
而不是
Map=newhashmap()
val-double=(x:Int)=>x*2
而不是(用番石榴)
Function double=new Function(){@Override public Integer apply(整数值){返回值*2;}}}
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风格的类型类
- 高阶类型
我认为现有的答案不合适。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有视图边界,这是一个隐式参数,作用类似于另一个类型边界
- 斯卡拉
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) }