我意識到「強類型」和「軟類型」的定義是鬆散的並且可以解釋,但我還沒有找到與無類型球拍(根據我的理解意味着動態輸入)和類型球拍的明確定義這個。球拍(和類型球拍)是強類型還是輕類型?
我再次確定它不是那麼幹燥,但至少我想了解更多關於哪個方向傾斜的東西。我對這件事的研究越多,我就越困惑,所以提前謝謝你的幫助!
我意識到「強類型」和「軟類型」的定義是鬆散的並且可以解釋,但我還沒有找到與無類型球拍(根據我的理解意味着動態輸入)和類型球拍的明確定義這個。球拍(和類型球拍)是強類型還是輕類型?
我再次確定它不是那麼幹燥,但至少我想了解更多關於哪個方向傾斜的東西。我對這件事的研究越多,我就越困惑,所以提前謝謝你的幫助!
的一個問題是,人們不同意有關的幾乎所有這些術語的含義。所以...接下來是我的看法(雖然它是一個相當有見識的人,如果我自己說的話)。
所有語言都使用某些值集合,並具有一些運行時行爲。嘗試向某個函數添加數字幾乎在所有語言中都失敗。你可以稱之爲「類型系統」,但它可能不是正確的術語。
那麼什麼是類型系統?現在,我聲稱這個術語通常指的是檢查程序並靜態地[*]推斷程序屬性的系統。通常,如果它被稱爲類型系統,這意味着將一個「類型」附加到每個表達式上,以約束表達式可以評估的值集/類。請注意,這個定義基本上使術語「動態類型」無意義。
注巨漏洞:有一個「平凡的類型系統」,它簡單地分配的「類型」包含所有的編程值的每一個的表達。所以,如果你願意,你可以從字面上考慮任何語言是靜態類型的。或者,如果你願意, 「統一」(注意那裏的「我」)。
好吧,直到黃銅大頭釘。
球拍沒有輸入。或者,如果您願意,「動態輸入」或「統一」,甚至「無類型」。
類型化的球拍是類型。它有一個靜態類型系統,爲每個表達式分配一種類型。它的類型系統是「健全的」,這意味着程序的評估 將符合由類型系統提出的聲明:如果類型化球拍 (此後稱爲TR)類型檢查您的程序並將類型「自然」指定爲 表達式,那麼它肯定會評估爲自然數(假設在TR類型檢查器或Racket運行時系統中沒有錯誤 )。
Typed Racket具有許多不同尋常的特性,允許使用TR編寫的代碼與Racket中編寫的代碼進行互操作。其中最着名的是「出現類型」,它允許TR程序處理像(U Number String)
這樣的類型(即,值爲或的數字或字符串),而不像之前的類似系統那樣爆炸。不過,你的問題是關於Racket和TR,而簡單的答案是基本的Racket語言沒有靜態類型系統,而TR的確如此。
[*]定義術語「靜態」超出了本文的範圍:)。
強類型和弱類型與靜態或動態類型無關。你可以有他們的組合,所以你有4個變化。 (強/靜,弱/靜,強/動,弱/動)。 方案(因此#lang racket
)是動態的,並且屬於輸入類型。
> (string-append "test" 5)
string-append: contract violation
expected: string?
given: 5
argument position: 2nd
other arguments...:
它的所有值都有一個類型,函數可以要求一個類型。如果你將一個字符串附加到一個數字上,你會得到一個類型錯誤。您需要使用number->string
明確地將該數字轉換爲字符串以滿足所有參數爲字符串的合約。對於弱類型的語言,比如JavaScript,它只會將該數字轉換爲一個字符串,以便滿足該函數。較少的代碼,但可能更多的運行時錯誤。
由於方案是強類型#lang typed/racket
肯定是太。
雖然計劃/ #lang racket
是動態輸入的,但我不完全確定#lang typed/racket
是否完全是靜態的。 The Guide稱它爲逐漸型語言。在回答這樣的問題
「弱類型」的定義之一是,當操作數之間存在類型不匹配而不是給出錯誤時,語言將盡力繼續,將操作數從一種類型強制轉換爲另一種類型,或給出默認結果。
例如,在Perl含有數字的字符串將被如果在算術運算使用它強制轉換爲號碼:
# This Perl program prints 6.
print 3 * "2a"
在此定義下,球拍將被分類發生動態類型(類型錯誤在運行時)和強類型(它不會自動將值從一種類型轉換爲另一種類型)。
由於類型化球拍不會更改球拍的運行時語義(除了引入一些額外的合同檢查),它將與普通球拍一樣具有強類型。
順便說一句,人們使用的通常詞語是弱和強打字。軟鍵入可能指的是在90年代創建的one specific kind of type system。它的表現並不盡如人意,這也是人們想出類似球拍和打字稿等語言中使用的漸進式打字系統的原因之一。