基本数据模型( Basic Data Models)
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类型变量。