我不明白為什么當我查看型別時:例如:
a = (1, 2)
我得到a :: (Num a, Num b) => (a, b)
,如果我查看型別:
b = ('a', 'b')
我得到b :: (Char, Char)而不是像:
b :: (Char a, Char b) => (a, b)?
提前致謝!
uj5u.com熱心網友回復:
Num是一個typeclass,它是一組型別,這看起來有點類似于 Java/C#/ 中的介面...作為Numtypeclass成員的型別需要實作一組特定的功能,就像在 Java 中一樣實作介面的型別應該實作某些方法。Char另一方面,A是type,而不是 typeclass 。
如果您撰寫一個整數文字,它可以是屬于型別Num類成員的任何型別,因為該型別類有一個函式fromInteger :: Num a => Integer -> a,該函式隨后被呼叫以將整數文字轉換為該數字型別。
'a'另一方面,如果您撰寫像這樣的字符文字,那么唯一可以決議的型別是Char.
對于字串文字,您可以使用OverloadedStrings擴展名,在這種情況下,字串文字可以采用屬于IsStringtypeclass成員的任何型別。
uj5u.com熱心網友回復:
Haskell 有兩種型別的文字:單態和多型。(雖然更準確地說,文字可以評估為單態或多型型別的值。)
'c'是單態文字的一個例子;它是單一型別的值,即Char.
> :t 'c'
'c' :: Char
1另一方面,是多型文字。它可以是具有Num實體的任何型別的值。
> :t 1
1 :: Num p => p
> :t 1 :: Int
1 :: Int :: Int
> > :t 1 :: Char
<interactive>:1:1: error:
? No instance for (Num Char) arising from the literal ‘1’
? In the expression: 1 :: Char
其他多型文字包括
浮點文字
> :t 3.4 3.4 :: Fractional p => pOverloadedStrings啟用擴展時的字串文字。> :t "foo" "foo" :: [Char] > :set -XOverloadedStrings > :t "foo" "foo" :: Data.String.IsString p => pOverloadedLists啟用擴展時列出文字。> :t ['a', 'b'] ['a', 'b'] :: [Char] > :set -XOverloadedLists > :t ['a', 'b'] ['a', 'b'] :: (GHC.Exts.IsList l, GHC.Exts.Item l ~ Char) => l資料建構式
Nothing(如果您想將空建構式視為文字)> :t Nothing Nothing :: Maybe aNothing中,例如,可以是型別的值Maybe Int,Maybe Char等等。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/339377.html
上一篇:使用模式匹配多載函式?
