0

无涯教程-Haskell - 类型类

 8 months ago
source link: https://blog.51cto.com/u_14033984/8926764
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK