📜  Haskell-基本数据模型

📅  最后修改于: 2020-11-04 06:55:00             🧑  作者: Mango


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

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

号码

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”。

0

字符

像数字一样,Haskell可以智能地识别输入的字符。转到您的Haskell命令提示符,然后键入任何带双引号或单引号的字符。

让我们提供以下行作为输入并检查其输出。

Prelude> :t "a" 

它将产生以下输出-

"a" :: [Char] 

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

看下面的示例,在该示例中,我们将一些无效输入作为char传递,这又导致了错误。

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

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

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

Haskell遵循常规的ASCII编码样式。让我们看下面的示例以了解更多信息-

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

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

字符串不过是字符的集合。没有使用字符串的特定语法,但是Haskell遵循用双引号表示字符串的常规样式。

看下面的示例,我们在其中传递字符串“ Tutorialspoint.com”。

Prelude> :t "tutorialspoint.com" 

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

"tutorialspoint.com" :: [Char] 

查看如何将整个字符串仅解码为Char数组。让我们转到另一种数据类型及其语法。一旦开始实际实践,我们将习惯于所有数据类型及其使用。

布尔型

布尔数据类型也非常类似于其他数据类型。请看下面的示例,在该示例中,我们将使用一些布尔输入(例如“ 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 

它将产生以下输出-

:9:1: Not in scope: 'true' 

在上面的示例中,Haskell无法区分“ true”和数字值,因此我们的输入“ true”不是数字。因此,Haskell编译器会引发错误,指出我们的输入不是其作用域。

列表和列表理解

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

与其他数据类型一样,您无需将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] 

此代码将产生以下错误-

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

清单理解

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

Prelude> [x*2| x [x*2| x [x| x

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

元组

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

元组是不可变的数据类型,因为我们无法在运行时修改元素的数量,而列表是可变的数据类型。

另一方面,List是同构数据类型,但是Tuple本质上是异构的,因为Tuple可能在其中包含不同类型的数据。

元组由单个括号表示。请看以下示例,以了解Haskell如何处理元组。

Prelude> (1,1,'a') 

它将产生以下输出-

(1,1,'a') 

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