2014-03-29 100 views
2

在GHCI ID功能的id類型是:類型在Haskell

Prelude> :t id 
id :: a -> a 

但是,如果我定義我自己id功能,爲什麼類型的名稱變量tta之間有區別嗎?

Prelude> let identity x = x 
Prelude> :t identity 
identity :: t -> t 

回答

8

at沒有什麼區別,他們被稱爲類型變量,代表任何類型的,你可以有。請注意,它們是用小寫字母編寫的,其中類型在開始處以大寫字母書寫(除了具有特殊語法的列表以外)。

此外,如果你寫一個文件,並將其加載到GHCI通過ghci testmodule.hs

module Testmodule where 

identity :: b -> b 
identity x = x 

然後ghci的會告訴你到底你在定義中使用的信。

+1

重要的是t - > t類型保持不變。這是想要的行爲id功能 – arnoapp

+3

此外,我覺得它有助於精神上用'id :: forall a替換id :: a - > a'。 a - > a'。這樣就清楚了類型變量綁定(聲明)的位置。 – projedi

6

這實際上具有相同的答案,如果我在問

如果我定義我自己的版本的版本

Prelude> let identity' q = q

爲什麼是值的名稱變量 qqx之間有區別嗎?

對一般的參數變量關鍵的一點是,他們的名字基本上都是任意。這是lambda-calculus的基本屬性:α-equivalence。我們僅僅用替換爲\q -> q(或者,在lambda風格中,λx.xλq.q)。實際上,類型變量也是參數,儘管它看起來並不像它們。但是在引擎蓋下,Haskell多態簽名應該被讀作System F,所以我們真的有Λα . α -> α,通常寫成forall a . a -> a。這顯然相當於forall t . t -> t

+0

影響類型變量名稱的標識q = q爲false。類型變量名稱與定義中使用的變量名稱無關。 –

+1

@ AlainO'Dea在這個答案中他沒有說或暗示任何地方。 – Cubic

+0

@ AlainO'Dea:確實;請正確閱讀! (不可否認,缺少引號內代碼片段的額外顏色支持並不能幫助我(爲了使意圖更清晰一些,我對其進行了重新格式化),但是我仍然無法看出您如何錯誤地說出關於類型和價值級別的範圍。) – leftaroundabout