请看以下代码片段:
Prelude> import Data.Word
Prelude> data Foo = Foo Word8 deriving Show
Prelude> Foo 4
Foo 4
Prelude> Foo 44
Foo 44
Prelude> Foo 444
Foo 188
我有些惊讶444会像不安全的C语言一样被隐式转换为188。我认为这看起来相当容易出错。在Haskell中,处理这种转换的惯用方法是什么?
更新
看起来这只是字面值的多态行为,现代编译器对此进行了警告。最重要的是,类型系统不允许这种隐式截断。如果运行时值已知,则Foo (444 :: Int)
会生成类型不匹配的错误,因此如果值只在运行时知道,这是完全安全的。