類型系統的一些概念,衆說紛紜,使用上也比較亂。有些東西,甚至很差嚴格定義。如下算學術界的一種相對「嚴格」的說法。java
首先了解一下基本概念express
語言設計時,能夠定義一組forbidden behaviors. 它必須包括全部untrapped errors, 但可能包含trapped errors.數組
有了上面的概念,再討論強、弱類型,靜態、動態類型bash
偏向於不容忍隱式類型轉換,弱類型相對於強類型來講類型檢查更不嚴格,好比說容許變量類型的隱式轉換,容許強制類型轉換等等。強類型語言通常不容許這麼作。app
弱類型設計
> "1"+2 '12'
強類型blog
>>> "1"+2 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: cannot concatenate 'str' and 'int' objects
其中靜態類型能夠分爲兩種:ip
簡單地說,就是在聲明瞭一個變量以後,不能改變它的類型的語言,是靜態語言;可以隨時改變它的類型的語言,是動態語言。由於動態語言的特性,通常須要運行時虛擬機支持。ci
動態類型get
>>> a = 1 >>> type(a) <type 'int'> >>> a = "s" >>> type(a) <type 'str'>
靜態類型
Prelude> let a = "123" :: Int <interactive>:2:9: Couldn't match expected type `Int' with actual type `[Char]' In the expression: "123" :: Int In an equation for `a': a = "123" :: Int