簡體   English   中英

理解兩個Haskell簽名之間的區別,一個使用forall

[英]Understanding the difference between two Haskell signatures, one using forall

本文中,有一個具有以下簽名的函數:

vreplicate :: forall a n . SNatI n => a -> Vec a n 

這個簽名和沒有forall簽名有什么區別:

vreplicate :: SNatI n => a -> Vec a n 

我的印象是,沒有forall ,它隱含意味着與前面的forall相同,它命名所有類型變量。

有兩個重要的案例,其中包括forall 第一個是forall的位置可以改變一個類型的含義 - 如果它出現在箭頭的左邊,這意味着函數的參數比其他情況“更多態”。 這種差異是一個基本的差異; 但是,它似乎並不適用於此。

第二個區別是語法(而不是基本),即:在存在ScopedTypeVariables的情況下,由forall綁定的變量打開一個打字范圍,而沒有forall隱式綁定的變量則不會。 因此,在vreplicate的主體中,可以使用類型變量an並確保它們引用與vreplicate的簽名中提到的相同類型。 如果沒有forall (或沒有ScopedTypeVariables ),在vreplicate主體中使用an會引入新的通用量化變量,並且程序員有責任確保它們與vreplicate簽名中的類型統一,如果這是期望。 更多詳細信息可在文檔中找到

如果沒有仔細閱讀本文,我無法確定,但我強烈打賭后者正在這里發生。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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