簡體   English   中英

函數簽名中的類型變量

[英]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具有類型ay具有類型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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM