Nik*_*kov 7 floating-point haskell types numbers
我在寻找一个数字类型能够代表,说,值0.213123或0.0,或者1.0,但拒绝超范围值,如-0.2123和1.2312.是否存在符合该目的的特定类型,以及将数字限制在特定范围内的最佳一般方法是什么?
当然,首先想到的答案是:只是使用Double,但是被Haskell的类型系统破坏了我已经习惯了最大程度地保护类型级别的程序.
一个严肃的建议
您可以在正确的位大小的单词周围使用newtype包装器(和智能构造函数):
newtype SmallFrac = SF Word64
-- Example conversion (You'd actually want to make
-- instances of common classes, I assume)
sfToDouble :: SmallFrac -> Double
sfToDouble (SF x) = fromIntegral x / fromIntegral (maxBound `asTypeOf` x)
instance Show SmallFrac where
show = show . sfToDouble
Run Code Online (Sandbox Code Playgroud)
实现乘法和除法可能比您想要的更昂贵,但至少添加很容易(模数防止上溢/下溢)并且您声称不需要任何操作,所以甚至更好.
一个不太有用的建议
如果您只需要一个表示值在1和0之间的符号,那么请参考dave4420的建议,并且只需要一个单位类型:
newtype SmallFrac = SF ()
Run Code Online (Sandbox Code Playgroud)
此类型没有任何操作,甚至没有转换到其他类型的兴趣,例如Double,但这符合所述的请求.
| 归档时间: |
|
| 查看次数: |
376 次 |
| 最近记录: |