Haskell是一种函数语言,它是严格类型化的,这意味着编译器将在编译时知道整个应用程序中使用的数据类型。
Int 整数类型
Int是代表Integer类型数据的类型类,2147483647到-2147483647范围内的每个整数都属于Int类型类。
fType::Int -> Int -> Int fType x y=x*x + y*y main=print (fType 2 4)
在这里,我们将函数 fType()的类型设置为 int 。该函数采用两个 int 值,并返回一个 int 值。如果编译并执行这段代码,那么它将产生以下输出-
sh-4.3$ghc -O2 --make *.hs -o main -threaded -rtsopts sh-4.3$main 20
Integer 整数超集
整数可以视为Int的超集,此值不受任何数字限制,因此Integer可以是任何长度,没有任何限制。 Int和Integer类型之间的基本区别如下示例代码-
fType::Int -> Int -> Int fType x y=x*x + y*y main=print (fType 212124454 44545454454554545445454544545)
如果编译以上代码,将抛出以下错误消息:
main.hs:3:31: Warning: Literal 44545454454554545445454544545 is out of the Int range - 9223372036854775808..9223372036854775807 Linking main ...
发生此错误是因为我们的函数fType()期望一个Int类型值,并且我们传递了一些真正的大Int类型值,为避免此错误,让我们用"Integer"修改类型"Int"并观察其区别。
fType::Integer-> Integer -> Integer fType x y=x*x + y*y main=print (fType 212124454 4454545445455454545445445454544545)
现在,它将产生以下输出-
sh-4.3$main 1984297512562793395882644631364297686099210302577374055141
Float 浮点类型
看一下下面的代码。它显示了Float类型如何在Haskell中工作-
fType::Float -> Float -> Float fType x y=x*x + y*y main=print (fType 2.5 3.8)
该函数将两个浮点值作为输入,并产生另一个浮点值作为输出。当您编译并执行此代码时,它将产生以下输出-
sh-4.3$main 20.689999
Double 双精度类型
Double是浮点数,末尾具有双精度,看下面的例子-
fType::Double -> Double -> Double fType x y=x*x + y*y main=print (fType 2.56 3.81)
当您执行以上代码时,它将生成以下输出-
sh-4.3$main 21.0697
Bool 布尔类型
布尔是布尔类型,它可以是True或False,执行以下代码以了解Bool类型在Haskell中的工作方式-
main=do let x=True if x == False then putStrLn "X matches with Bool Type" else putStrLn "X is not a Bool Type"
在这里,我们将变量" x"定义为布尔型,并将其与另一个布尔值进行比较以检查其创意。它将产生以下输出-
sh-4.3$main X is not a Bool Type
Char 字符类型
字符代表字符,单引号内的所有内容均视为字符,在以下代码中,我们修改了先前的 fType()函数以接受Char值并将Char值返回为输出。
fType::Char-> Char fType x='K' main=do let x='v' print (fType x)
上面的代码将调用 fType()函数,其 char 值为'v',但是它将返回另一个char值,即'K'。这是它的输出-
sh-4.3$main 'K'
EQ 相等类型
EQ类型类是提供测试表达式是否相等的函数的接口, 任何要检查表达式是否相等的Type类都应属于此EQ Type类。
上面提到的所有标准Type类都是此EQ类的一部分, 每当我们使用上述任何一种类型检查任何相等性时,实际上是在调用EQ类型类。
在以下示例中,我们在内部使用"=="或“/="操作使用EQ类型。
main=do if 8 /= 8 then putStrLn "The values are Equal" else putStrLn "The values are not Equal"
它将产生以下输出-
sh-4.3$main The values are not Equal
Ord 类型
Ord是另一个提供给我们排序函数的接口类。到目前为止,我们使用的所有类型都是该Ord接口的一部分。 与EQ接口类似,可以使用“>","<","<=",“> =",“compare"来调用Ord接口。
请在下面的示例中找到我们使用此Type类的“比较"函数的示例。
main=print (4 <= 2)
在这里,Haskell编译器将检查4是否小于或等于2。由于不是,因此代码将产生以下输出-
sh-4.3$main False
Show 查看
Show 具有将其参数打印为字符串的函数,无论其参数是什么,它始终将输出打印为字符串。在以下示例中,我们将使用此界面打印整个列表。
main=print (show [1..10])
它将在控制台上产生以下输出,在这里,双引号表示它是字符串类型的值。
sh-4.3$main "[1,2,3,4,5,6,7,8,9,10]"
Read 读取
读取接口的函数与"show"相同,但不会以字符串格式打印输出,在以下代码中,我们使用了 read 接口读取字符串值并将其转换为Int值。
main=print (readInt "12") readInt::String -> Int readInt=read
在这里,我们将String变量(" 12")传递给 readInt 方法,该方法在转换后返回12(Int值)。这是它的输出-
sh-4.3$main 12
Enum 枚举
枚举是Type类的另一种类型,可在Haskell中启用顺序或有序函数,可以通过 Succ,Pred,Bool,Char 等命令访问此Type类。
以下代码显示了如何查找12的后继值。
main=print (succ 12)
它将产生以下输出-
sh-4.3$main 13
Bounded 上下限类型
具有上限和下限的所有类型都属于此Type类。如, Int 类型数据的最大范围为" 9223372036854775807",最小范围为" -9223372036854775808"。
以下代码显示Haskell如何确定Int类型的最大和最小范围。
main=do print (maxBound::Int) print (minBound::Int)
它将产生以下输出-
sh-4.3$main 9223372036854775807 -9223372036854775808
现在,尝试查找Char,Float和Bool类型的最大和最小界限。
Num 数字类型
此类型类用于数字运算, 诸如Int,Integer,Float和Double之类的类型都属于此Type类。 看一下下面的代码-
main=do print(2::Int) print(2::Float)
它将产生以下输出-
sh-4.3$main 2 2.0
Integral 整数类型
整数可以视为Num Type类的子类, Num Type类保存所有类型的数字,而Integral类型类仅用于整数, Int和Integer是此Type类下的类型。
Floating 浮点数类型
像Integral一样,Floating也是Num Type类的一部分,但它仅包含浮点数, 因此,Float和Double属于此类类型。
自定义类型
与任何其他编程语言一样,Haskell允许开发人员定义用户定义的类型,在下面的示例中,我们将创建一个用户定义的类型并使用它。
data Area=Circle Float Float Float surface::Area -> Float surface (Circle _ _ r)=pi * r ^ 2 main=print (surface $Circle 10 20 10 )
在这里,我们创建了一个名为 Area 的新类型。接下来,我们使用这种类型来计算圆的面积。
请记住,"data"是此处的关键字,Haskell中所有用户定义的类型始终以大写字母开头。
它将产生以下输出-
sh-4.3$main 314.15927
参考链接
https://www.learnfk.com/haskell/haskell-types-and-type-class.html