實作基本的陣列操作。
在函式式語言中,length、map和reduce這類陣列操作非常常見。請在不使用現有函式的情況下,實作一系列基本的陣列操作。
要實作的操作,其確切數量和名稱會依 track 而有所不同,以避免與現有名稱衝突,但你會實作的一般操作包括:
append(給定兩個陣列,把第二個陣列中的所有項目加到第一個陣列的尾端);concatenate(給定一連串的陣列,把所有陣列中的所有項目合併成一個攤平的陣列);filter(給定一個述詞和一個陣列,回傳所有 predicate(item) 為 True 的項目所組成的陣列);length(給定一個陣列,回傳其中項目的總數);map(給定一個函式和一個陣列,回傳對所有項目套用 function(item) 所得結果的陣列);foldl(給定一個函式、一個陣列和初始累加器,從左側將每個項目摺疊(縮減)進累加器);foldr(給定一個函式、一個陣列和一個初始累加器,從右側將每個項目摺疊(縮減)進累加器);reverse(給定一個陣列,回傳一個包含所有原始項目、但順序相反的陣列)。請注意,傳遞給摺疊函式(foldl、foldr)的引數順序很重要。
在 Roc 裡,完全不使用任何內建函式來實作這些陣列操作幾乎是不可能的,因為你總得有辦法在陣列尾端附加元素,或在開頭插入元素。
在其他語言裡,你可能會用像 Haskell 的:或 Python 的+=這類運算子,但在 Roc 裡,你必須使用 List函式。
所以在這道練習中,你可以使用List.append(但請避免使用其他任何內建函式)。
許多函式程式語言會用連結串列當作主要的集合型別。
在連結串列開頭插入元素、或從開頭取出第一個元素都很有效率,所以在那些語言裡,你會用List.prepend來實作陣列操作。
不過在 Roc 裡,List是陣列(連續的一塊位元組)。
陣列和連結串列的特性不同,例如陣列可以有效地用索引存取元素,也可以在尾端附加新元素。
因此,在 Roc 裡我們很常使用List.append,很少使用List.prepend。
Roc 使用的名稱和一般指令中列出的名稱略有不同:
concat 而非 append
join 而非 concatenate
len 而非 length
fold 而非 foldl
fold_rev 而非 foldr
不過,以下這些函式名稱在 Roc 中是標準的:
filtermapreverse試著用用看:
match list {
[] => ...
[first, .. as rest] => ...
}
或者
match list {
[] => ...
[.. as rest, last] => ...
}