为自定义数字类型启用 -Woverflowed-literals

问题描述 投票:0回答:1

默认情况下,如果文字的精度对其类型而言太大,GHC 会启用 -Woverflowed-literals

 警告
发出消息:

OverflowedLiterals.hs:10:12: warning: [GHC-97441] [-Woverflowed-literals] Literal 258 is out of the Word8 range 0..255 | 10 | print (258 :: Word8) | ^^^ OverflowedLiterals.hs:15:12: warning: [GHC-97441] [-Woverflowed-literals] Literal 9223372036854775817 is out of the Int range -9223372036854775808..9223372036854775807 | 15 | print (9223372036854775817 :: Int) | ^^^^^^^^^^^^^^^^^^^
有没有办法为自定义数字类型启用此警告?

例如,我想要这个代码

data Word4 = Word4 Bool Bool Bool Bool instance Num Word4 where ... main = print (17 :: Word4)
导致编译器抱怨

StackoverflowExample:LINE:COL: warning: [GHC-97441] [-Woverflowed-literals] Literal 17 is out of the Word4 range 0..15
    
haskell warnings ghc
1个回答
0
投票

没有,或者至少在撰写本文时没有ghc

。检查此问题的代码位于
here [GitHub]

warnAboutOverflowedLiterals dflags lit | wopt Opt_WarnOverflowedLiterals dflags , Just (i, tc) <- lit = if -- These only show up via the 'HsOverLit' route | sameUnique tc intTyConName -> check i tc minInt maxInt | sameUnique tc wordTyConName -> check i tc minWord maxWord | sameUnique tc int8TyConName -> check i tc (min' @Int8) (max' @Int8) | sameUnique tc int16TyConName -> check i tc (min' @Int16) (max' @Int16) | sameUnique tc int32TyConName -> check i tc (min' @Int32) (max' @Int32) | sameUnique tc int64TyConName -> check i tc (min' @Int64) (max' @Int64) | sameUnique tc word8TyConName -> check i tc (min' @Word8) (max' @Word8) | sameUnique tc word16TyConName -> check i tc (min' @Word16) (max' @Word16) | sameUnique tc word32TyConName -> check i tc (min' @Word32) (max' @Word32) | sameUnique tc word64TyConName -> check i tc (min' @Word64) (max' @Word64) | sameUnique tc naturalTyConName -> checkPositive i tc -- These only show up via the 'HsLit' route | sameUnique tc intPrimTyConName -> check i tc minInt maxInt | sameUnique tc wordPrimTyConName -> check i tc minWord maxWord | sameUnique tc int8PrimTyConName -> check i tc (min' @Int8) (max' @Int8) | sameUnique tc int16PrimTyConName -> check i tc (min' @Int16) (max' @Int16) | sameUnique tc int32PrimTyConName -> check i tc (min' @Int32) (max' @Int32) | sameUnique tc int64PrimTyConName -> check i tc (min' @Int64) (max' @Int64) | sameUnique tc word8PrimTyConName -> check i tc (min' @Word8) (max' @Word8) | sameUnique tc word16PrimTyConName -> check i tc (min' @Word16) (max' @Word16) | sameUnique tc word32PrimTyConName -> check i tc (min' @Word32) (max' @Word32) | sameUnique tc word64PrimTyConName -> check i tc (min' @Word64) (max' @Word64)

因此,它对不同的(隐式)数据构造函数进行硬编码,以与

Int

Word
Int16
Word32
 等一起使用,从而检查相应的下限和上限。

严格来说,也许有可能,但目前尚未实现。如果我们知道

17

 转换为的类型是 
Num
Bounded
 的实例,那么检查它可能会有点复杂,因为它只是将 
17
 转换为
fromInteger 17

© www.soinside.com 2019 - 2024. All rights reserved.