在GHCI ID功能的id
類型是:類型在Haskell
Prelude> :t id
id :: a -> a
但是,如果我定義我自己id
功能,爲什麼類型的名稱變量t
? t
和a
之間有區別嗎?
Prelude> let identity x = x
Prelude> :t identity
identity :: t -> t
在GHCI ID功能的id
類型是:類型在Haskell
Prelude> :t id
id :: a -> a
但是,如果我定義我自己id
功能,爲什麼類型的名稱變量t
? t
和a
之間有區別嗎?
Prelude> let identity x = x
Prelude> :t identity
identity :: t -> t
有a
和t
沒有什麼區別,他們被稱爲類型變量,代表任何類型的,你可以有。請注意,它們是用小寫字母編寫的,其中類型在開始處以大寫字母書寫(除了具有特殊語法的列表以外)。
此外,如果你寫一個文件,並將其加載到GHCI通過ghci testmodule.hs
module Testmodule where
identity :: b -> b
identity x = x
然後ghci的會告訴你到底你在定義中使用的信。
這實際上具有相同的答案,如果我在問
如果我定義我自己的版本的版本
Prelude> let identity' q = q
爲什麼是值的名稱變量q
?q
和x
之間有區別嗎?
對一般的參數變量關鍵的一點是,他們的名字基本上都是任意。這是lambda-calculus的基本屬性:α-equivalence。我們僅僅用替換爲\q -> q
(或者,在lambda風格中,λx.x
與λq.q
)。實際上,類型變量也是參數,儘管它看起來並不像它們。但是在引擎蓋下,Haskell多態簽名應該被讀作System F,所以我們真的有Λα . α -> α
,通常寫成forall a . a -> a
。這顯然相當於forall t . t -> t
。
影響類型變量名稱的標識q = q爲false。類型變量名稱與定義中使用的變量名稱無關。 –
@ AlainO'Dea在這個答案中他沒有說或暗示任何地方。 – Cubic
@ AlainO'Dea:確實;請正確閱讀! (不可否認,缺少引號內代碼片段的額外顏色支持並不能幫助我(爲了使意圖更清晰一些,我對其進行了重新格式化),但是我仍然無法看出您如何錯誤地說出關於類型和價值級別的範圍。) – leftaroundabout
重要的是t - > t類型保持不變。這是想要的行爲id功能 – arnoapp
此外,我覺得它有助於精神上用'id :: forall a替換id :: a - > a'。 a - > a'。這樣就清楚了類型變量綁定(聲明)的位置。 – projedi