榆树 - 列表
列表、元组和记录数据结构可用于存储值的集合。
本章讨论如何在 Elm 中使用 List。
列表是同类值的集合。列表中的值必须全部具有相同的数据类型。
使用变量存储值时请考虑以下限制 -
变量本质上是标量。换句话说,在声明时,变量只能保存一个值。这意味着要在程序中存储 n 个值,需要 n 个变量声明。因此,当需要存储更大的值集合时,使用变量是不可行的。
程序中的变量以随机顺序分配内存,因此很难按照声明的顺序检索/读取值。
句法
List_name = [value1,value2,value3.....valuen]
插图
以下示例展示了如何在 Elm 中使用列表。在 elm REPL 中尝试这个例子 -
> myList1 = [10,20,30] [10,20,30] : List number > myList2 = ["hello","world"] ["hello","world"] : List String
如果我们尝试将不同类型的值添加到列表中,编译器将抛出类型不匹配错误。如下所示。
> myList = [1,"hello"] -- TYPE MISMATCH --------------------------------------------- repl-temp-000.elm The 1st and 2nd entries in this list are different types of values. 4| [1,"hello"] ^^^^^^^ The 1st entry has this type: number But the 2nd is: String
列表操作
下表显示了列表上的常见操作 -
先生 否 | 方法 | 描述 |
---|---|---|
1 | isEmpty :列出一个 -> Bool | 检查列表是否为空 |
2 | 反向:列出 a -> Bool | 反转输入列表 |
3 | length : 列出一个 -> Int | 返回列表的大小 |
4 | 最大值:列表可比较 -> Maybe.Maybe 可比较 | 返回最大值 |
5 | 最小值:列表可比较 -> Maybe.Maybe 可比较 | 返回最小值 |
6 | sum : 列表编号 -> 编号 | 返回列表中所有元素的总和 |
7 | 产品:列表编号 -> 编号 | 检查列表是否为空 |
8 | 排序:列出可比较的列表 -> 列出可比较的列表 | 按升序对列表进行排序 |
9 | concat :列表(列表 a)-> 列表 a | 将一堆列表合并为一个 |
10 | 追加:列出一个 -> 列出一个 -> 列出一个 | 将两个列表合并在一起 |
11 | 范围:整数 -> 整数 -> 列表整数 | 返回从开始到结束的数字列表 |
12 | 过滤器 : (a -> Bool) -> 列出 a -> 列出 a | 从输入列表中过滤值列表 |
13 | head : 列出 a -> Maybe.Maybe a | 返回列表中的第一个元素 |
14 | tail : : 列表 a -> Maybe.Maybe (列表 a) | 返回除头部之外的所有元素 |
是空的
如果列表为空,则此函数返回 true。
句法
List.isEmpty list_name
要检查函数的签名,请在 elm REPL 中输入以下内容 -
> List.isEmpty <function> : List a -> Bool
插图
> List.isEmpty <function> : List a -> Bool > List.isEmpty [10,20,30] False : Bool
撤销
该函数反转列表。
句法
List.reverse list_name
要检查函数的签名,请在 elm REPL 中输入以下内容 -
> List.reverse <function> : List a -> List a
插图
> List.reverse [10,20,30] [30,20,10] : List number
长度
该函数返回列表的长度。
句法
List.length list_name
要检查函数的签名,请在 elm REPL 中输入以下内容 -
> List.length <function> : List a -> Int
插图
> List.length [10,20,30] 3 : Int
最大限度
该函数返回非空列表中的最大元素。
句法
List.maximum list_name
要检查函数的签名,请在 elm REPL 中输入以下内容 -
> List.maximum <function> : List comparable -> Maybe.Maybe comparable
插图
> List.maximum [10,20,30] Just 30 : Maybe.Maybe number > List.maximum [] Nothing : Maybe.Maybe comparable
最低限度
该函数返回非空列表中的最小元素。
句法
List.minimum list_name
要检查函数的签名,请在 elm REPL 中输入以下内容 -
> List.minimum <function> : List comparable -> Maybe.Maybe comparable
插图
> List.minimum [10,20,30] Just 10 : Maybe.Maybe number
和
该函数返回列表中所有元素的总和。
句法
List.sum list_name
要检查函数的签名,请在 elm REPL 中输入以下内容 -
> List.sum <function> : List number -> number
插图
> List.sum [10,20,30] 60 : number
产品
此函数返回列表中所有元素的乘积。
句法
List.product list_name
要检查函数的签名,请在 elm REPL 中输入以下内容 -
<function> : List number -> number
插图
List.product [10,20,30] 6000 : number
种类
此函数对列表中的值从最低到最高进行排序。
句法
List.sort list_name
要检查函数的签名,请在 elm REPL 中输入以下内容 -
> List.sort <function> : List comparable -> List comparable
插图
> List.sort [10,20,30] [10,20,30] : List number
连接
该函数将一堆列表连接成一个列表。
句法
List.concat [ [list_name1],[list_name2],[list_name3],.....[list_nameN] ]
要检查函数的签名,请在 elm REPL 中输入以下内容 -
> List.concat <function> : List (List a) -> List a
插图
> List.concat [[10,20], [30,40],[50,60]] [10,20,30,40,50,60] : List number
附加
该函数将两个列表放在一起。
句法
List.append [list_name1] [list_name2]
要检查函数的签名,请在 elm REPL 中输入以下内容 -
> List.append <function> : List a -> List a -> List a
插图
> List.append [10,20] [30,40] [10,20,30,40] : List number
++ 运算符还可用于将一个列表附加到另一个列表。如下例所示 -
> [10.1,20.2] ++ [30.3,40.4] [10.1,20.2,30.3,40.4] : List Float
范围
该函数创建一个数字列表,每个元素加一。列表中应包含的最小和最大数字将传递给该函数。
句法
List.range start_range end_range
要检查函数的签名,请在 elm REPL 中输入以下内容 -
> List.range <function> : Int -> Int -> List Int
插图
> List.range 1 10 [1,2,3,4,5,6,7,8,9,10] : List Int
筛选
该函数从输入列表中过滤一组值。仅保留通过测试的值。
句法
List.filter test_function input_list
要检查函数的签名,请在 elm REPL 中输入以下内容 -
> List.filter <function> : (a -> Bool) -> List a -> List a
插图
以下示例过滤输入列表中的所有偶数
> List.filter (\n -> n%2==0) [10,20,30,55] [10,20,30] : List Int
头
该函数返回输入列表中的第一个元素。
句法
List.head input_list
要检查函数的签名,请在 elm REPL 中输入以下内容 -
> List.head <function> : List a -> Maybe.Maybe a
插图
> List.head [10,20,30,40] Just 10 : Maybe.Maybe number > List.head [] Nothing : Maybe.Maybe a
尾巴
此函数返回列表中第一个之后的所有元素。
句法
List.tail input_list
要检查函数的签名,请在 elm REPL 中输入以下内容 -
> List.tail <function> : List a -> Maybe.Maybe (List a)
插图
> List.tail [10,20,30,40,50] Just [20,30,40,50] : Maybe.Maybe (List number) > List.tail [10] Just [] : Maybe.Maybe (List number) > List.tail [] Nothing : Maybe.Maybe (List a)
使用 Cons 运算符
cons 运算符 ( :: ) 将一个元素添加到列表的前面。
插图
> 10::[20,30,40,50] [10,20,30,40,50] : List number
要添加的新元素和列表中值的数据类型必须匹配。如果数据类型不匹配,编译器会抛出错误。
> [1,2,3,4]::[5,6,7,8] -- TYPE MISMATCH --------------------------------- ------------ repl-temp-000.elm The right side of (::) is causing a type mismatch. 3| [1,2,3,4]::[5,6,7,8] ^^^^^^^^^ (::) is expecting the right side to be a: List (List number) But the right side is: List number Hint: With operators like (::) I always check the left side first. If it seems fine, I assume it is correct and check the right side. So the problem may be in how the left and right arguments interact.
列表是不可变的
让我们检查一下 Elm 中的列表是否是不可变的。第一个列表myList与值 1 连接时创建一个新列表并返回到myListCopy。因此,如果我们显示初始列表,它的值不会改变。
> myList = [10,20,30] [10,20,30] : List number > myListCopy = 1::myList [1,10,20,30] : List number > myList [10,20,30] : List number >myList == myListCopy False : Bool