[英]What does `Num a => a` mean in Haskell type system?
如果我強制 Haskell 推斷數字的類型,我會得到Num a => a
。 例如:
Prelude> :t 1
1 :: Num a => a
但是a => a
是什么意思?
1:: Num a => a
表示1
具有某種類型a
,其中a
是Num
類型類的一個實例。 注意Num
不是類型,而是類型類,它描述了各種類型的公共屬性。 例如, Num
類型類描述了數字類型,因此支持基本算術。 本機整數類型Int
是Num
的實例,任意大小的Integer
、浮點類型Double
甚至有理數類型Rational
也是。
a => a
沒有任何意義。 完整的短語是Num a => a
。 這意味着“a”是Num
類型類的一個實例。
您也可以將其讀作(Num a) => a
。 它提供了一個上下文來說明a
是數字。
但是,它不是a
的類型; 它只是說a
應該在Num
類型類中。
類型類有點像面向對象編程中的接口,因為它們定義a
某些行為,但沒有詳細定義。
請注意->
和=>
之間是有區別的。 第一個用於函數簽名; 第二個用於顯示類型類。
輸入1:: Num a => a
意味着“ 1
是類型a
,對於類型類Num
中的所有類型a
”。 更簡潔地說,它意味着“ 1
是任何數字類型”。
由於這種類型,您可以將1
傳遞給任何需要任何數字類型的函數,例如Int
、 Double
等。
稍微擴展您的示例,我們還有[1,2,3]:: Num a => [a]
。 這意味着“ [1,2,3]
是類型a
的值列表,對於類型類Num
中的所有類型a
”。 換句話說,“ [1,2,3]
是任何數字類型的值列表”。
表達式1::Num a => a
可以分解為 3 個部分以便於閱讀/理解。
讓我們一步步構建:
1::
表示1 的類型為
c:: Char
表示c 的類型為 Char
=> 之前的所有內容都是“類約束” ,因此在 :: 和 => 之間插入Num a
即1:: Num a => a
表示“1 具有a
的類型,但不僅是任何類型,而且具有類約束,其中a
是 Num 類的成員。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.