簡體   English   中英

在 Haskell 類型系統中,`Num a => a` 是什么意思?

[英]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 ,其中aNum類型類的一個實例。 注意Num不是類型,而是類型類,它描述了各種類型的公共屬性。 例如, Num類型類描述了數字類型,因此支持基本算術。 本機整數類型IntNum的實例,任意大小的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傳遞給任何需要任何數字類型的函數,例如IntDouble等。

稍微擴展您的示例,我們還有[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.

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