TL; DR:這是一個亂七八糟的廢話類型,不值得擔心。
整數文字可以表示實現Num
類型類型的任何類型的值。所以1
或任何其他整數文字可以用在任何你需要一個數字的地方。
doubleVal :: Double
doubleVal = 1
intVal :: Int
intVal = 1
integerVal :: Integer
integerVal = 1
這使我們能夠靈活地在任何數字上下文中使用積分文字。
當你只使用一個沒有任何類型上下文的整數文字時,ghci不知道它是什麼類型。
Prelude> :type 1
1 :: Num a => a
ghci的是說「是‘1’是某種類型的我不知道,但我知道,無論何種類型是,該類型實現了Num
類型類」。
在Haskell源中每次出現整數文字都用隱式的fromInteger
函數包裝。因此,(1 "one")
隱式轉換爲((fromInteger (1::Integer)) "one")
,而子表達式(fromInteger (1::Integer))
有一個尚未知的類型Num a => a
,這也意味着它是某種未知類型,但我們知道它提供了一個類型類型的實例Num
。
我們也可以看到,它被應用於像一個功能"one"
,所以我們知道它的類型必須有形式[Char] -> a0
其中a0
是另一個未知類型。所以a
和[Char] -> a0
必須相同。將它們代入Num a => a
類型,我們知道1
必須具有類型Num ([Char] -> a0) => [Char] -> a0)
,而表達式(1 "one")
的類型爲Num ([Char] -> a0) => a0
。請閱讀最後一類是「有某種類型的A0這是應用[Char]
參數傳遞給函數的結果,而功能型是Num
類的一個實例。
所以表達式本身具有有效的類型Num ([Char] -> a0) => a0
。
Haskell有一個名爲Monomorphism restriction的東西,其中一個方面是表達式中的所有類型變量在評估它們之前都必須有一個特定的已知類型,GHC在某些情況下使用類型默認規則,以適應但是,GHC不知道任何類型的a0
它可以插入上面的那個定義了Num
實例的類型表達式中,所以我t沒有辦法處理它,並且給你「No Instance for Num ...」的消息。
請記住,該空間是函數應用程序運算符。 – Bergi