2016-10-31 42 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

相关问题