在 Elm 中,Array是一种快速的不可变集合,可以包含零个或多个同类型的值。
List 是默认导入的,Array 则不同:Array 模块必须显式导入,可以使用 import Array 或类似写法。
数组可以这样定义:
import Array exposing (Array)
empty : Array Char
empty = Array.empty
singleValue = Array.fromList [ 5 ] --> Array Int
repeatSingleValue = Array.repeat 2 5 --> Array.fromList [ 5, 5 ]
initialiseFromIndex = Array.initialise 3 (\index -> index * 2) --> Array.fromList [ 0, 2, 4 ]
initialisefromList = Array.fromList [ "a", "b", "c" ] --> Array.fromList [ "a", "b", "c" ]
使用 Array.push 可以向数组中添加元素:
twoToFour = Array.fromList [ 2, 3, 4 ]
oneToFour = Array.push 1 twoToFour --> Array.fromList [ 1, 2, 3, 4 ]
使用 Array.get 可以取出数组中的元素:
sixSeven = Array.fromList [ 6, 7 ]
Array.get 0 sixSeven --> Just 6
使用 Array.set 可以修改数组中的元素:
sixSeven = Array.fromList [ 6, 7 ]
Array.set 1 8 sixSeven --> Array.fromList [ 6, 8 ]
数组的操作用 Array 模块中定义的函数完成。
oneTwo = Array.fromList [ 1, 2 ]
Array.length oneTwo --> 2
作为准魔术师,Elyse 需要练一些基本功。她有一副牌,想要对它做各种操作。
为了简单一点,她只用 1 到 10 这十张牌。
实现getCard函数,返回给定牌堆中位置为index的那张牌。如果这个下标不在牌堆中,就返回 Nothing。
getCard 2 ( Array.fromList [ 1, 2, 4, 1 ] )
--> Just 4
getCard 6 ( Array.fromList [ 1, 2, 4, 1 ] )
--> Nothing
实现setCard函数,它返回一个牌堆,其中位置为index的那张牌被替换为传入的新牌。
如果index不在牌堆中,就返回原来的牌堆。
setCard 2 6 ( Array.fromList [ 1, 2, 4, 1 ] )
--> Array.fromList [ 1, 2, 6, 1 ]
setCard 6 6 ( Array.fromList [ 1, 2, 4, 1 ] )
--> Array.fromList [ 1, 2, 4, 1 ]
实现addCard函数,返回加入了这张新牌的牌堆。
addCard 8 ( Array.fromList [ 5, 9, 7, 1 ] )
--> Array.fromList [ 5, 9, 7, 1, 8 ]
实现removeCard函数,返回一个移除了位置为index的那张牌之后的牌堆。
如果给定的index不是牌堆中的有效下标,就返回原来的牌堆。
removeCard 2 ( Array.fromList [ 3, 2, 6, 4, 8 ] )
--> Array.fromList [ 3, 2, 4, 8 ]
removeCard 2 ( Array.fromList [ 3, 2 ] )
--> Array.fromList [ 3, 2 ]
实现evenCardCount函数,统计牌堆中偶数牌的数量。
evenCardCount (Array.fromList [ 3, 8, 4, 5, 1, 6, 10 ] )
--> 4