在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Scala/ Scala 課堂:類型和多態(tài)類型(一)
Scala 課堂:高級(jí)類型(二)
Scala 課堂:基礎(chǔ)(三)
Scala 課堂:類型和多態(tài)類型(一)
Scala 課堂:基礎(chǔ)(二)
Scala課堂:基礎(chǔ)(五)
Scala 課堂:基礎(chǔ)(四)
Scala 課堂:基礎(chǔ)(六)
Scala 課堂:集合(二)
Scala課堂:類型和多態(tài)類型(二)
Scala 課堂:模式匹配和函數(shù)組合
Scala 課堂:高級(jí)類型(一)
Scala 課堂:集合(一)
Scala 課堂:基礎(chǔ)(一)

Scala 課堂:類型和多態(tài)類型(一)

這里我們轉(zhuǎn)載 Twitter 的 Scala 課堂 ,轉(zhuǎn)載的內(nèi)容基本來自 Twitter 的 Scala 課堂中文翻譯,部分有小改動(dòng).

什么是靜態(tài)類型?它們?yōu)槭裁从杏茫?/h2>

按 Pierce 的話講:“類型系統(tǒng)是一個(gè)語法方法,它們根據(jù)程序計(jì)算的值的種類對(duì)程序短語進(jìn)行分類,通過分類結(jié)果錯(cuò)誤行為進(jìn)行自動(dòng)檢查?!?類型允許你表示函數(shù)的定義域和值域。例如,從數(shù)學(xué)角度看這個(gè)定義: f: R -> N
它告訴我們函數(shù)“f”是從實(shí)數(shù)集到自然數(shù)集的映射。 抽象地說,這就是 具體 類型的準(zhǔn)確定義。類型系統(tǒng)給我們提供了一些更強(qiáng)大的方式來表達(dá)這些集合。
鑒于這些注釋,編譯器可以 靜態(tài)地 (在編譯時(shí))驗(yàn)證程序是 合理 的。也就是說,如果值(在運(yùn)行時(shí))不符合程序規(guī)定的約束,編譯將失敗。 一般說來,類型檢查只能保證 不合理 的程序不能編譯通過。它不能保證每一個(gè)合理的程序都 可以 編譯通過。
隨著類型系統(tǒng)表達(dá)能力的提高,我們可以生產(chǎn)更可靠的代碼,因?yàn)樗軌蛟谖覀冞\(yùn)行程序之前驗(yàn)證程序的不變性(當(dāng)然是發(fā)現(xiàn)類型本身的模型 bug?。?。學(xué)術(shù)界一直很努力地提高類型系統(tǒng)的表現(xiàn)力,包括值依賴(value-dependent)類型!
需要注意的是,所有的類型信息會(huì)在編譯時(shí)被刪去,因?yàn)樗巡辉傩枰?。這就是所謂的擦除。

Scala 中的類型

Scala 強(qiáng)大的類型系統(tǒng)擁有非常豐富的表現(xiàn)力。其主要特性有: 參數(shù)化多態(tài)性 粗略地說,就是泛型編程 (局部)類型推斷 粗略地說,就是為什么你不需要這樣寫代碼 val i: Int = 12: Int 存在量化 粗略地說,為一些沒有名稱的類型進(jìn)行定義 視窗 我們將下周學(xué)習(xí)這些;粗略地說,就是將一種類型的值“強(qiáng)制轉(zhuǎn)換”為另一種類型

參數(shù)化多態(tài)性

多態(tài)性是在不影響靜態(tài)類型豐富性的前提下,用來(給不同類型的值)編寫通用代碼的。 例如,如果沒有參數(shù)化多態(tài)性,一個(gè)通用的列表數(shù)據(jù)結(jié)構(gòu)總是看起來像這樣(事實(shí)上,它看起來很像使用泛型前的 Java):


scala> 2 :: 1 :: "bar" :: "foo" :: Nil
res5: List[Any] = List(2, 1, bar, foo)

現(xiàn)在我們無法恢復(fù)其中成員的任何類型信息。


scala> res0.head
res2: Any = 2

所以我們的應(yīng)用程序?qū)?huì)退化為一系列類型轉(zhuǎn)換(“asInstanceOf[]”),并且會(huì)缺乏類型安全的保障(因?yàn)檫@些都是動(dòng)態(tài)的)。 多態(tài)性是通過指定 類型變量 實(shí)現(xiàn)的。


scala>  def drop1[A](l: List[A]) = l.tail
drop1: [A](l: List[A])List[A]

scala>  drop1(List(1,2,3))
res3: List[Int] = List(2, 3)

Scala 有秩1多態(tài)性

粗略地說,這意味著在 Scala 中,有一些你想表達(dá)的類型概念“過于泛化”以至于編譯器無法理解。假設(shè)你有一個(gè)函數(shù)


def toList[A](a: A) = List(a)

你希望繼續(xù)泛型地使用它:


def foo[A, B](f: A => List[A], b: B) = f(b)
<console>:7: error: type mismatch;
 found   : b.type (with underlying type B)
 required: A
       def foo[A, B](f: A => List[A], b: B) = f(b)

這段代碼不能編譯,因?yàn)樗械念愋妥兞恐挥性谡{(diào)用上下文中才被固定。即使你“釘住”了類型 B:


scala> def foo[A](f: A => List[A], i: Int) = f(i)
<console>:7: error: type mismatch;
 found   : i.type (with underlying type Int)
 required: A
       def foo[A](f: A => List[A], i: Int) = f(i)

類型推斷

靜態(tài)類型的一個(gè)傳統(tǒng)反對(duì)意見是,它有大量的語法開銷。Scala 通過 類型推斷 來緩解這個(gè)問題。 在函數(shù)式編程語言中,類型推斷的經(jīng)典方法是 Hindley Milner 算法,它最早是實(shí)現(xiàn)在 ML 中的。 Scala 類型推斷系統(tǒng)的實(shí)現(xiàn)稍有不同,但本質(zhì)類似:推斷約束,并試圖統(tǒng)一類型。

在 Scala 中所有類型推斷是 局部的 。Scala 一次分析一個(gè)表達(dá)式。例如:


scala>  def id[T](x: T) = x
id: [T](x: T)T

scala>  val x = id(322)
x: Int = 322

scala>  val x = id("hey")
x: String = hey

scala>  val x = id(Array(1,2,3,4))
x: Array[Int] = Array(1, 2, 3, 4)

類型信息都保存完好,Scala 編譯器為我們進(jìn)行了類型推斷。請(qǐng)注意我們并不需要明確指定返回類型。