![](/img/trans.png)
[英]Why does the type of local variables that are values affect the type of input variables in the type signature of a function?
[英]Type variables in function signature
如果我執行以下操作
functionS (x,y) = y
:t functionS
functionS :: (a, b) -> b
現在具有此功能:
functionC x y = if (x > y) then True else False
:t function
我希望得到:
functionC :: (Ord a, Ord b) => a -> b -> Bool
但是我得到:
functionC :: Ord a => a -> a -> Bool
GHCI似乎可以接受之前的2個結果,但是為什么給我第二個結果呢? 為什么沒有定義類型變量a和b?
我認為您可能會誤讀類型簽名。 毫無疑問,您用來指導思想的示例令人困惑。 特別是在您的元組示例中
functionS :: (a,b) -> b
functionS (x,y) = y
表示法(_,_)
表示兩種不同的含義。 在第一行中, (a,b)
表示type ,其對的類型為第一個元素的類型為a
,第二個元素的類型a
b
。 在第二行中, (x,y)
表示特定對 ,其中x
具有類型a
而y
具有類型b
。 盡管此“雙關語”提供了有用的助記符,但在您初次使用它時可能會造成混淆。 我希望對的類型是常規類型的構造函數:
functionS :: Pair a b -> b
functionS (x,y) = y
因此,繼續您的問題。 在簽名中,您會得到
functionC :: Ord a => a -> a -> Bool
a
是一種類型 。 Ord a
表示Ord a
類型a
元素相對於彼此是有序的。 該函數接受兩個相同類型的參數。 可排序的一些類型是Integer
(數字地), String
(字典地)和其他一些。 這意味着您可以知道兩個Integer
的哪個較小,或者兩個String
的哪個較小。 但是,我們不一定知道如何判斷Integer
是否小於String
(這很好)!您是否看到 javascript必須使用哪種類型的shenanigans來支持無類型的相等性?Haskell不必解決此問題所有!)。 這就是這個簽名的意思– –只有一個可排序的類型a
,並且該函數接受了同一類型的兩個元素。
您可能仍然想知道為什么functionS
的簽名具有兩個不同的類型變量。 這是因為沒有約束將它們限制為相同,例如必須將它們彼此相對排序。 functionS
在一對組件上都可以很好地工作,其中兩個組件都是整數,就像一個組件是整數而另一個組件是字符串一樣。 沒關系 Haskell總是選擇最有效的類型。 因此,如果不強迫它們相同,則它們將不同。
有更多的技術方法可以解釋所有這些情況,但是我覺得應該有一個直觀的解釋。 希望對您有所幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.