2015-11-06 83 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