美文网首页Haskell
[Haskell] 数字类型之间的转换

[Haskell] 数字类型之间的转换

作者: 何幻 | 来源:发表于2016-06-30 16:23 被阅读1638次

受Common Lisp与Scheme影响,Haskell提供了多种类型的数字。
使用类型类(type class),数字类型上面的操作符或者函数,大多是重载的(overloaded)。
(甚至,也是重载的,见1::Num a => a 。。

不同的数值定义在了不同的类型类中。

> :t 1
> 1 :: Num a => a

> :t 1.0
> 1.0 :: Fractional a => a

如图,类型类之间是有包含关系的。。
例如,Num类型类是Eq的子集,因为每一个数字必须首先能被判断相等性。
Num的子集Real也是Ord的子集,因为实数可以比较大小,而复数不能。
Integral类型类包含了所有限制大小和无限制大小的整数。
Fractional类型类包含所有非整数类型的数字。
Floating类型类包含了所有浮点数类型的数字,包括实数和复数。

Prelude仅包含一部分数字类型,
Int,定宽整数(fixed sized integer)
Integer,任意精度的整数
Float,单精度浮点数
Double,双精度浮点数

其他数字类型,例如Rational和Complex定义在了库(library)中。
Rational类型的值是两个Integer的比例,定义在了Ratio库中。


(1)Integral to Num
Integral包含了所有的整数,该类型类两个常用的实例是Integer类型和Int类型。
Integer,表示任意精度的整数,也成为“大整数”(bignum,big-integer)。
Int,是定宽的整数,具体存储位宽取决于特定的机器,但至少应该包括-229~229-1范围内的整数。

我们主要使用fromIntegral对Integral进行转换。
它把一个Integral类型类实例类型的值,转换成Num类型类实例类型的值。

fromIntegral :: (Integral a, Num b) => a -> b

例如,给定一个Int类型的值n,我们不能直接使用sqrt n求平方根,
因为sqrt只接受Floating类型类实例类型的参数。

sqrt :: Floating a => a -> a

我们必须写成,

sqrt (fromIntegral n)

关于Integer类型还有两个更具体的函数。

fromInteger :: Num a => Integer -> a
toInteger :: Integral a => a -> Integer

(2)Real to Fractional
RealFrac包含所有的整数和分数,该类型类两个常用的实例是Rational类型和Double类型。
Rational,任意精度的分数。
Double,双精度浮点数。

Real类型类包含Integral和RealFrac。
我们主要使用realToFrac来对Real进行转换。

realToFrac :: (Real a, Fractional b) => a -> b

关于Rational类型还有两个更具体的函数。

fromRational :: Fractional a => Rational -> a
toRational :: Real a => a -> Rational

(3)RealFrac to Integral
这种转换可能会损失精度,我们可以使用下面4个函数。

ceiling :: (RealFrac a, Integral b) => a -> b
floor :: (RealFrac a, Integral b) => a -> b
truncate :: (RealFrac a, Integral b) => a -> b
round :: (RealFrac a, Integral b) => a -> b

(4)Float to Double
我们可以使用GHC.FLoatmodule来对浮点数进行转换。

float2Double :: Float -> Double
double2Float :: Double -> Float

参考:
The Haskell 98 Report: Standard Haskell Classes
Converting numbers

相关文章

  • [Haskell] 数字类型之间的转换

    受Common Lisp与Scheme影响,Haskell提供了多种类型的数字。使用类型类(type class)...

  • chapter2 类型和函数

    Haskell的类型系统 强类型:类型转换必须显示使用类型转换函数。 静态:不是python这种动态语言。java...

  • Swift-数字类型转换、别名

    整数和浮点转换 整数和浮点数字类型之间的转换必须显式: 浮点到整数转换也必须显式。 整数类型可以使用Double或...

  • 4_类型转换

    关键词:类型之间的转换、强制类型转换、隐式类型转换 1. 类型之间的转换 C语言中的数据类型可以进行转换,转换方式...

  • 回顾Date.0402(类型转换、运算)

    类型转换 隐式转换 显式转换 转换为Boolean类型:Boolean(xxx) ; !!xxx 数字类型转换为布...

  • 强、弱类型语言 and 动态、静态类型语言

    先上结论: 强类型:偏向于不容忍隐式类型转换。譬如说 Haskell 的 int 就不能变成 double。 弱类...

  • 01 数据类型

    swift中结构体在haskell中的描述 枚举类型在haskell中的描述 枚举携带类型在haskell中描述 ...

  • 将字符串转换成数字

    将字符串转换成double类型的数字: 将字符串转换成Float类型的数字: 将字符串转换成整形的数字:

  • 类型转化问题

    一.类型分为 基本数据类型 应用数据类型 二.基本类型之间的转换 同种数据类型之间的转换整形之间的转换: 1.大的...

  • Swift4.2~as,as!,as?

    一,as 类型转换as :同类型的数据 OC和Swift之间转换 二,as! 类型的强制转换as!操作符是类型转换...

网友评论

    本文标题:[Haskell] 数字类型之间的转换

    本文链接:https://www.haomeiwen.com/subject/aixfjttx.html