当前位置: 首页 > 文档资料 > Haskell 中文教程 >

基本数据模型( Basic Data Models)

优质
小牛编辑
123浏览
2023-12-01

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

在本教程中,我们将使用我们网站上提供的Haskell在线平台( https://www.iowiki.com/codingground.htm )。

Numbers

Haskell足够聪明,可以将一些数字解码为数字。 因此,您不必像其他编程语言那样在外部提及其类型。 根据示例,转到prelude命令提示符,然后运行“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”。

0

人物(Characters)

与数字一样,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' 

通过错误消息“:4:1:不在范围内:`a'”,Haskell编译器警告我们它无法识别您的输入。 Haskell是一种语言,其中所有内容都使用数字表示。

Haskell遵循传统的ASCII编码风格。 让我们看一下下面的例子来了解更多 -

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

看看您的输入如何解码为ASCII格式。

String

string只是一组字符。 没有使用字符串的特定语法,但Haskell遵循使用双引号表示字符串的传统样式。

看一下我们传递字符串“iowiki.com”的以下示例。

Prelude> :t "iowiki.com" 

它将在屏幕上产生以下输出 -

"iowiki.com" :: [Char] 

查看整个字符串是如何解码为仅限Char数组的。 让我们转到其他数据类型及其语法。 一旦我们开始实际操作,我们将习惯所有数据类型及其用途。

Boolean

与其他数据类型一样,布尔数据类型也非常简单。 请看下面的示例,我们将使用一些布尔输入(例如“True”或“False”)来使用不同的布尔运算。

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

在上面的例子中,我们不需要提到“True”和“False”是布尔值。 Haskell本身可以对其进行解码并执行相应的操作。 让我们用“true”或“false”修改输入。

Prelude> true 

它将产生以下输出 -

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

在上面的例子中,Haskell无法区分“true”和数字值,因此我们的输入“true”不是数字。 因此,Haskell编译器抛出一个错误,指出我们的输入不是它的范围。

列表和列表理解

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

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

看一下下面的例子,它展示了Haskell如何处理List。

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'

列表理解

列表理解是使用数学表达式生成列表的过程。 请看下面的例子,我们使用数学表达式生成一个列表,格式为[output | 范围,条件]。

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]

这种使用数学表达式创建一个List的方法称为List Comprehension

Tuple

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

元组是一种不可变的数据类型,因为我们不能在运行时修改元素的数量,而List是一种可变的数据类型。

另一方面,List是一种同类数据类型,但是Tuple本质上是异构的,因为元组内部可能包含不同类型的数据。

元组用单括号表示。 看一下下面的例子,看看Haskell如何处理元组。

Prelude> (1,1,'a') 

它将产生以下输出 -

(1,1,'a') 

在上面的例子中,我们使用了一个带有两个number类型变量的Tuple和一个char类型变量。