[英]What is Scala's “powerful” type system?
討論Scala時,類型系統始終被視為主要功能之一。 它被稱為強大的,並且是語言名字對象的主要原因(Scala是“可伸縮語言”的縮寫)。 有人可以解釋Scala鍵入的工作原理/為什么這個獨特的,以及它如何有助於語言的可擴展性?
我不認為現有的答案是恰當的。 Scala有很多便利,但它們與類型系統無關,因為它們與類型有關。 事實上,類型推斷與類型系統的力量直接沖突 - 如果它不那么強大,可以有完整的類型推斷(如在Haskell中)。
所以,
接下來,有一些與Scala的含義相關的功能,這是它們的優點。
與上一個注釋,implicits和類型推斷相關聯,使得Scala的類型系統turing完整 。 也就是說,您將任意程序編碼為類型,編譯器將在編譯時“運行”。 這里證明,通過SKI微積分,在類型中有一個“越野車”無限循環作為進一步的演示。
上面的功能列表相當大,令人印象深刻。 然而,Scala結合implicits和類型推斷以在編譯時生成靜態證明(例如視圖邊界和上下文邊界)的方式使得Scala的類型系統是唯一的。 AFAIK,沒有其他語言可以做到這一點,盡管肯定有其他語言通過其他方式提供證明功能。
Scala的類型系統優於Java的一些優點:
在許多情況下可以推斷出類型,而不是明確指定。 這更方便,但它促進了使用復雜的類型。
val map = new Map[String, (String, String)]()
代替
Map<String, Tuple<String, String>> map = new HashMap<String, Tuple<String, String>>()
功能可以在類型系統中簡單表達。 如果你想看看它有多強大,可以考慮將番石榴庫作為Java的解決方案。 這是令人難以置信的約束和冗長(但仍然有用)。
val double = (x: Int) => x * 2
而不是(使用番石榴)
Function<Integer, Integer> double = new Function<Integer, Integer>() { @Override public Integer apply(Integer value) { return value * 2; }}
元組是Scala中的一種類型,它繞過了Java只能返回單個值的問題。
Scala支持類型方差,因此當Cat是Thing的子類型時(或當反向關系成立時),您可以指定SomeObject是SomeObject的子類型。 在java中, 泛型不是協變的 ,這通常是有問題的。
Scala使用特征支持有限形式的多重繼承。 與接口(其中多個可以用Java實現)不同,特征可以定義方法和變量。
數組像任何其他類一樣透明地處理。
您可以通過隱式定義向現有類添加方法 。 例如,您可以向Arrays of Integers添加“sum”方法。
class IntArray(value: Array[Int]) { def sumIt = value.reduceRight(_+_) } implicit def pimpArray(xs: Array[Int]) = new IntArray(xs) Array(1,2,3).sumIt
對於上述某些主題,這是另一個很好的資源: http : //www.codecommit.com/blog/scala/scala-for-java-refugees-part-5
除了schmmd的優秀答案,Scala的類型系統還有更重要的功能:
object
是Java中static
成員變量和方法的干凈替代,例如, object
具有自己的類型,可以作為參數傳遞 type
聲明:您可以為復雜類型定義別名,例如type FactorMap[A] = Map[A, Set[Int]]
最后一點是我的最愛之一。 例如,你不能用Java編寫簡單的通用仿函數接口。 你需要 ......
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);
}
如果你替換像List
而不是C
這樣的具體類型,它就可以工作。 在Java中,您可以抽象出一個包含的內容(例如,通過編寫`List),但是您不能在容器本身上進行抽象。 相信我,我試圖找到漏洞(結果就是這個 )。 在Scala中,這是一件輕而易舉的事:
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)
}
任何類型系統,你可以編碼HList,TList和HOF的類型是相當強大的恕我直言。 有關詳細信息,請參閱http://apocalisp.wordpress.com/2010/06/08/type-level-programming-in-scala/ 。
我不知道你是否了解Java,但想象Scala的類型系統是這樣的:
我會更喜歡o wrie,我的鍵盤jus壞了,對不起!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.