Haskell是一种纯函数式编程语言,因此它比其他编程语言更具交互性和智能性.在本章中,我们将了解Haskell的基本数据模型,这些模型实际上是预定义的,或者以某种方式智能地解码到计算机内存中.
在本教程中,我们将使用可用的Haskell在线平台我们的网站( https://www.it1352.com/codingground.htm ).
Haskell非常智能,可以将某个数字解码为数字.因此,您不必像其他编程语言那样在外部提及其类型.按照例子,转到你的前奏命令提示符,然后运行"2 + 2"并点击回车.
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 <interactive>:1:1: Not in scope: 'a' Prelude> a <interactive>:4:1: Not in scope: 'a'
错误消息"< interactive>:4 :1:不在范围内:"a""Haskell编译器警告我们它无法识别您的输入. Haskell是一种语言,其中所有内容都使用数字表示.
Haskell遵循传统的ASCII编码风格.让我们看一下下面的例子,了解更多和减号;
Prelude> '\ 97' 'a' Prelude> '\ '67' 'C'
查看输入如何解码为ASCII格式.
字符串只是一组字符.使用字符串没有特定的语法,但Haskell遵循用双引号表示字符串的传统方式.
看一下我们传递字符串"Tutorialspoint"的下面的例子. com".
Prelude> :t"it1352.com"
它将在屏幕上产生以下输出 :
"it1352.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
它将产生以下输出 :
<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中的列表本质上是同质的,这意味着他们赢了" t允许您声明不同类型的数据类型的列表.任何像[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的方法数学表达式被称为列表理解.
Haskell提供了另一种在单个数据中声明多个值的方法类型.它被称为 Tuple .元组可以被认为是一个列表,但是元组和列表之间存在一些技术差异.
元组是一个不可变的数据类型,因为我们无法修改元素的数量在运行时,List是一种可变数据类型.
另一方面,List是一种同类数据类型,但是Tuple本质上是异构的,因为元组可能包含不同类型的其中的数据.
元组用单括号表示.看一下下面的例子,看看Haskell如何处理一个元组.
Prelude> (1,1,'a')
它将产生以下输出 :
(1,1,'a')
在上面的例子中,我们使用了一个带有两个数字