2016-10-31 88 views
4

當我在ghci中輸入:t 4我得到爲什麼ghci輸出(Num a)=> a for:t 4而不是(Ord a)=> a?

Prelude> :t 4 
4 :: Num t => t 

我明白爲什麼4不僅是int或一個整數,它是infered底了,但我不明白爲什麼4不作爲的Ord t => t或更正確的是這樣的:

4 :: (Ord t || Num t) => t 

因爲4既是OrdNumOrdNum有沒有關係。

那麼爲什麼:t 4只輸出Num

+0

這在[haskell報告]中描述(https://www.haskell.org/onlinereport/haskell2010/haskellch6.html#x13-1360006.4.1) – Lee

+4

假設我給了'4'類型'Ord t = > t'。現在我注意到'Bool'是'Ord'的一個實例。因此'4 :: Bool'。 「4 :: Bool」應該是「真」還是「假」,爲什麼? –

+0

@李Btw,有類似的問題關於類型違約規則:https://stackoverflow.com/questions/39251728/ghci-randomio-type-in​​ference我試圖回答它,理解報告,但仍然沒有明確的看法。也許更有經驗的_Haskell_用戶可以幫助:) – Shersh

回答

9

並非所有類型和Num情況下,也有實例爲Ord,而你只需要NumfromInteger部分有超載數字文字Haskell有。例如,來自Data.ComplexComplex具有Num實例,但不具有Ord。在這種情況下,4而不是Ord

ghci> import Data.Complex 
ghci> let x = 1 :: Complex Double 
ghci> let y = 2 :: Complex Double 
ghci> x < y 
<interactive> 
    * No instance for (Ord (complex Double)) arising from use of `<' 
    * In the expression: x < y 
     In the equation for `it': it = x < y 
ghci> 

正如@Lee所評論的那樣,這是report中列出的行爲。

+0

請注意,您解釋了爲什麼類型不是'(Ord t,Num t)=> t',而不是爲什麼它不是'(Ord t || Num t)=> (這不是有效的語法,但是,我假設,意思是說「t可能是'Ord'*或* a'Num')。 – sepp2k

+0

@ sepp2k這是真的 - 我沒有解釋' ||'那樣說,我認爲我間接地回答了這個問題...... – Alec

+0

好的thx。@Lee提供的鏈接中的'fromIntegral'這個東西非常有用,更有幫助的是鏈接到Section [3.4 .3](https://www.haskell.org/onlinereport/haskell2010/haskellch4.html#x10-790004.3.4)。因此,當我編寫'(3 <4)':推斷'4'的實際類型時編譯器必須找到一個滿足'(Num t,Ord t)=> t'的類型,它可以是'Int','Integer','Float','Double'(或者甚至更多的帶外部模塊)這是不明確的,會產生一個錯誤,但是對於Num來說,這些含糊不清是通過默認來解決的(在這種情況下)整數。 – Databyte

相關問題