当前位置: 首页 > 教程 > Haskell >

Haskell基本数据模型

精华
小牛编辑
131浏览
2023-03-14

Haskell是一种纯粹的函数式编程语言,因此比其他编程语言更具交互性和智能性。在本文章中,我们将学习Haskell的基本数据模型,这些数据模型实际上是预定义的或以某种方式智能地解码到计算机内存中的。

1. 数字

Haskell足够聪明,可以将某些数字解码为数字。因此,无需像在其他编程语言中通常那样在外部指定它的数据类型。如下示例中,进入到命令提示符,然后运行2 + 2并按Enter键,就可以得到结果了。

sh-4.3$ ghci 
GHCi, version 7.6.3: http://www.haskell.org/ghc/  :? for help 
Loading package ghc-prim ... linking ... done. 
Loading package integer-gmp ... linking ... done. 
Loading package base ... linking ... done. 
Prelude> 2+2

将收到以下输出结果:

4

在上面的代码中,只是将两个数字作为参数传递给GHCI编译器,但没有预先定义它们的类型,但是编译器可以将这两个数据项解码为数字。

接下来,尝试更复杂的数学计算,看看编译器是否能提供了正确的输出。尝试输入计算表达式:15+(5 * 5)- 40,如下所示:

Prelude> 15+(5*5)-40

上面的表达式按预期输出结果为:0

2. 字符

与数字一样,Haskell可以识别输入的字符。进入到Haskell命令提示符,然后输入任何带双引号或单引号的字符。
看看以下输入以及输出结果。

Prelude> :t "a"

它将产生以下结果:

"a" :: [Char]

请记住,在提供输入时使用(:t)。在上面的示例中,:t将包括与输入有关的特定类型。在接下来的章节中详细了解这种类型。

在下面这个示例中,我们将一些无效输入作为char传递,它将导致错误。

Prelude> :t a 
<interactive>:1:1: Not in scope: 'a'  

Prelude> a 
<interactive>:4:1: Not in scope: 'a'

通过错误消息<interactive>:1:1: Not in scope: 'a',Haskell编译器警告说它无法识别输入的内容。Haskell是一种语言,所有内容都使用数字表示。
Haskell遵循常规的ASCII编码样式。可以看看下面的示例以了解更多信息-

Prelude> '\97' 
'a'  
Prelude> '\67' 
'C'

3. 字符串

字符串是字符的集合。使用字符串没有特定的语法,但是Haskell遵循用双引号表示字符串的常规样式。
看下面的示例,传递字符串"yiibai.com"

Prelude> :t "yiibai.com"

执行上面示例代码,得到以下结果:

"yiibai.com" :: [Char]

了解如何将整个字符串解码为Char数组。通过另一种数据类型及其语法,当开始实际操作后,你将会习惯于所有数据类型及其使用。

4. 布尔型

布尔数据类型也非常类似于其他数据类型。在下面的示例中,我们将使用一些布尔输入(例如TrueFalse)使用不同的布尔运算。

Prelude> True && True 
True  
Prelude> True && False 
False   
Prelude> True || True 
True  
Prelude> True || False 
True

在上面的示例中,不必说明TrueFalse是布尔值。Haskell本身可以对其进行解码并执行相应的操作。下面修改使用truefalse作为输入。

Prelude> true

得到以下结果:

<interactive>:9:1: Not in scope: 'true'

在上面的示例中,Haskell无法区分true和数字值,因为输入true不是数字。所以,Haskell编译器将引发错误,指出输入不是其作用域。

5. 列表

与其他数据类型一样,List也是Haskell中使用的非常有用的数据类型。根据示例,[a,b,c]是字符列表,因此,根据定义,List是用逗号分隔的相同数据类型的集合。

与其他数据类型一样,无需将数据声明为List。Haskell可以通过查看表达式中使用的语法来解码输入。

下面示例演示Haskell如何处理列表。

Prelude> [1,2,3,4,5]

产生以下结果:

[1,2,3,4,5]

Haskell中的列表本质上是同类型的,因此它们不允许声明不同数据类型的列表。类似[1,2,3,4,5,a,b,c,d,e,f]这样的列表会产生错误。

Prelude> [1,2,3,4,5,a,b,c,d,e,f]

上面代码将产生以下错误输出:

<interactive>:17:12: Not in scope: 'a' 
<interactive>:17:14: Not in scope: 'b' 
<interactive>:17:16: Not in scope: 'c' 
<interactive>:17:18: Not in scope: 'd' 
<interactive>:17:20: Not in scope: 'e' 
<interactive>:17:22: Not in scope: 'f'

列表理解

列表理解是使用数学表达式生成列表的过程。请看下面的示例,在示例中使用数学表达式以[输出| 范围,条件]形式。

Prelude> [x*2| x<-[1..10]] 
[2,4,6,8,10,12,14,16,18,20]  
Prelude> [x*2| x<-[1..5]] 
[2,4,6,8,10]  
Prelude> [x| x<-[1..5]] 
[1,2,3,4,5]

这种使用数学表达式创建列表的方法称为列表理解。

6. 元组

Haskell提供了另一种在单个数据类型中声明多个值的方法。它被称为元组(Tuple)。元组可以视为列表,但是元组和列表之间存在一些技术差异。

元组是不可变的数据类型,因为无法在运行时修改元素的数量,而列表是可变的数据类型,列表是同构数据类型,但是Tuple本质上是异构的,因为Tuple可能在其中包含不同类型的数据。
元组由单个括号表示。请看以下示例,以了解Haskell如何处理元组。

Prelude> (1,1,'a')

上面程序将产生以下输出结果:

(1,1,'a')

在上面的示例中,使用了一个具有两个数字类型变量和一个char类型变量的元组。