JSRUN 用代码说话

类型与类型类

编辑教程

类型与类型类

Haskell是一种函数式语言,它是严格类型的,这意味着整个应用程序中使用的数据类型在编译时将为编译器所知.

内置类型类 在Haskell中,每个语句都被视为一个数学表达式,该表达式的类别被称为类型.您可以说"类型"是编译时使用的表达式的数据类型.

要了解有关类型的更多信息,我们将使用": t"命令.通常,类型可以被视为一个值,而类型类可以被认为是一组类似的类型.在本章中,我们将了解不同的内置类型.

Int

Int 是表示整数的类型类类型数据. 2147483647到-2147483647范围内的每个整数都属于 Int 类型类.在下面的示例中,函数 fType()将根据其定义的类型进行操作.

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

整数

整数可以视为 Int 的超集.该值不受任何数字的限制,因此整数可以是任意长度而没有任何限制.要查看 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类型值.为了避免这个错误,让我们用"整数"修改类型"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

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"定义为Bool,并将其与另一个布尔值进行比较以检查其原始性.它将产生以下输出 :

sh-4.3$ main
X is not a Bool Type

字符

字符代表字符.单引号内的任何内容都被视为字符.在下面的代码中,我们修改了之前的 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'

请注意,我们不会显式使用这些类型,因为Haskell足够智能,可以在声明之前捕获类型.在本教程的后续章节中,我们将看到不同类型和类型类如何使Haskell成为强类型语言.

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 Type Class

Ord 是另一个接口类,它给了我们订购的功能.到目前为止我们使用的所有类型都是 Ord 接口的一部分.与EQ界面一样,可以使用">","<","< =","> =","比较"来调用Ord界面.

请在下面找到我们使用此类型类的"比较"功能的示例.

main = print (4 <= 2)

这里,Haskell编译器将检查4是否小于或等于2.由于它不是,代码将产生以下输出 :

sh-4.3$ main 
False

显示

显示具有将其参数作为字符串打印的功能.无论它的论点是什么,它总是将结果打印为String.在以下示例中,我们将使用此界面打印整个列表. "show"可以用来调用这个界面.

main = print(show [1 .. 10])

它将在控制台上产生以下输出.这里,双引号表示它是String类型值.

sh-4.3$ main 
"[1,2,3,4,5,6,7,8,9,10]"

读取

读取接口与Show相同,但不会以String格式打印结果.在下面的代码中,我们使用 read 接口读取字符串值并将其转换为Int值.

main = print (readInt "12") 
readInt :: String -> Int 
readInt = read

这里,我们将一个String变量("12")传递给 readInt 方法转换后又返回12(Int值).这是它的输出 :

sh-4.3$ main 
12

枚举

枚举是另一种类型的类,它启用Haskell中的顺序或有序功能.可以通过 Succ,Pred,Bool,Char 等命令访问此Type类.

以下代码显示如何查找后继值12 .

main = print (succ 12)

它将产生以下输出 :

sh-4.3$ main
13

界限

所有具有上限和下限的类型都属于此类型类.例如, 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

积分

积分可以视为Num Type类的子类. Num Type类包含所有类型的数字,而Integral类类仅用于整数. Int和Integer是此Type类下的类型.

浮动

与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 的新类型.接下来,我们使用此类型来计算圆的面积.在上面的例子中,"surface"是一个以 Area 作为输入并产生 Float 作为输出的函数.

Keep记住,"data"是一个关键字,Haskell中的所有用户定义类型总是以大写字母开头.

它将产生以下输出 :

sh-4.3$ main
314.15927
JSRUN闪电教程系统是国内最先开创的教程维护系统, 所有工程师都可以参与共同维护的闪电教程,让知识的积累变得统一完整、自成体系。 大家可以一起参与进共编,让零散的知识点帮助更多的人。
X
支付宝
9.99
无法付款,请点击这里
金额: 0
备注:
转账时请填写正确的金额和备注信息,到账由人工处理,可能需要较长时间
如有疑问请联系QQ:565830900
正在生成二维码, 此过程可能需要15秒钟