好像你感到困惑類型變量。首先,在
f :: Maybe a -> Maybe a
f = \a -> a
的a
的第一行無關與a
「在第二行S,我們可以這樣寫:
f :: Maybe a -> Maybe a
f = \x -> x
甚至
f :: Maybe foo -> Maybe foo
f = \bar -> bar
a
是代表類型的變量。所以f
這裏宣佈f
有一次一大堆類型:
f :: Maybe Int -> Maybe Int
f :: Maybe String -> Maybe String
f :: Maybe (Maybe Bool) -> Maybe (Maybe Bool)
...
等。這不是我懷疑你認爲的一些「標籤」的論點。兩個a
都相同的事實意味着參數類型必須是相同的結果類型。如果我們說f :: Maybe a -> Maybe b
我們會得到這個家庭:
f :: Maybe Int -> Maybe Bool
f :: Maybe String -> Maybe String
f :: Maybe (Maybe Bool) -> Maybe Int
...
也就是a
和b
現在可以代表不同的類型,但參數和結果還是要Maybe
。
的原因,你不能說
f :: Maybe -> Maybe
是因爲Maybe
不是一個類型 - 這是一個類型構造。如果你給它一個類型,它會給你一個類型。所以Maybe Int
和Maybe String
是類型,一般Maybe a
是一種類型,只要a
是一種類型。
Maybe Int a
(這是解析(Maybe Int) a
)沒有意義,因爲Maybe Int
不是一個類型的構造函數 - 它不接受任何更多的參數。
建議閱讀:Types and Typeclasses來自LYAH。
您似乎對類型簽名中「a」代表的含義感到困惑。 '也許'不是一個類型,它是*類型的構造函數*。你提供一個類型,你得到一個新的類型,比如'Maybe Int','Maybe Bool','Maybe [String]'或Maybe(Maybe Char)'。 '也許'本身不是一個有效的類型,所以'也許 - >也許'也不是一個有效的類型。 'a'是一個*類型的變量*,它代表了一些調用者提供的類型,所以'也許a - >也許a''意味着'a'可以是任何類型,只要它在兩邊都是相同的。 'a'與你的lambda中的'a'沒有關係,它完全位於另一個命名空間中。 –
由於沒有人提到它,所以'Int 5'只有在'Int'是一個構造函數時(如'Just','Left')纔有效,但它不是。如果你想說'5'是'Int'類型,你可以使用類型註解('5 :: Int'),但在這種情況下它不是必需的。 – SwiftsNamesake