這可能是一個愚蠢的問題,但我無法弄清楚以下行為的基本規則:
。
foo :: t (f a) -> f a b -- accepted
foo = undefined
bar :: t [f a] -> f a b -- rejected
bar = undefined
在bar中,f分別應用于a和a b會導致種類錯誤,從而被拒絕,這是很合理的。但是為什么foo會被接受呢?
uj5u.com熱心網友回復:
它是f的種類。
由于回傳型別是f a b--即f應用于兩個引數,--這意味著f :: Type -> Type -> Type。
但此時f a被用作一個串列元素--[f a]--而串列元素必須是Type,這意味著f a :: Type,這意味著f :: Type -> Type.
不匹配。
foo的作業原理是,型別可以被部分應用。也就是說,如果f :: Type -> Type -> Type,那么f a :: Type -> Type。然后,型別t被允許有一個型別Type -> Type的引數,所以一切都匹配。
重申上述內容:
foo作業,因為型別t可以有一個Type -> Type的引數。bar不起作用,因為型別[](又稱 "list")必須有一個Type的引數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/316916.html
標籤:
上一篇:如何解釋一個多引數的函式?
