2015-11-06 84 views
9

Haskell RealFloat typeclass有一个叫做isIEEE的函数,根据documentation,如果参数是一个IEEE浮点数,则该函数给出'True'(并且可以想象,否则为False)。为什么Haskell的isIEEE总是评估为True?

但这里的isIEEEFloat实施:

instance RealFloat Float where 
    ... 
    isIEEE _ = True 

这里是为Double实施:

instance RealFloat Double where 
    ... 
    isIEEE _ = True 

如果isIEEE总是无条件True,为什么还要用呢?为什么要在前奏中呢?

+11

只是因为只有'RealFloat'附带GHC服从IEEE754情况下,这并不意味着你不能定义自己的情况下,哪些没有。 – leftaroundabout

+0

@leftaroundabout等等,你实际上可以定义你自己的浮点类型? –

+7

@WanderNauta这就是类型类的要点,只要你可以提供你可以将类型作为它的实例的函数。 – Koterpillar

回答

7

由于leftaroundaboutKoterpillar在评论中提到,所以可以定义你自己的RealFloat实例。这些定制的浮点类型不一定必须遵循IEEE标准。

instance RealFloat MyFloat where 
    isIEEE _ = False 
    ... 

此外,如果你的浮点类型不符合IEEE,你被允许拥有所有RealFloat谓词返回false:

(...)功能isNaN,isInfinite,isDenormalized, isNegativeZero和 isIEEE都支持使用IEEE标准表示的数字。对于非IEEE浮点数的 ,这些都可能返回false。

Haskell 98 Report, 6.4.6