Elm - รายการ

สามารถใช้โครงสร้างข้อมูล List, Tuples และ Record เพื่อจัดเก็บชุดค่าต่างๆ

บทนี้จะกล่าวถึงวิธีการใช้รายการใน Elm

รายการคือชุดของค่าที่เป็นเนื้อเดียวกัน ค่าในรายการต้องเป็นชนิดข้อมูลเดียวกัน

พิจารณาข้อ จำกัด ต่อไปนี้ในขณะที่ใช้ตัวแปรเพื่อเก็บค่า -

  • ตัวแปรเป็นสเกลาร์ในธรรมชาติ กล่าวอีกนัยหนึ่งในขณะที่ประกาศตัวแปรสามารถเก็บได้เพียงค่าเดียว ซึ่งหมายความว่าในการจัดเก็บค่า 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: รายการ a -> Bool ตรวจสอบว่ารายการว่างเปล่า
2 ย้อนกลับ: รายการ a -> Bool ย้อนกลับรายการอินพุต
3 ความยาว: List a -> Int ส่งคืนขนาดของรายการ
4 สูงสุด: รายการเทียบเคียง -> อาจจะเทียบได้ คืนค่าสูงสุด
5 ขั้นต่ำ: เทียบเคียงรายการ -> อาจจะเทียบได้ คืนค่าขั้นต่ำ
6 ผลรวม: หมายเลขรายการ -> หมายเลข ส่งคืนผลรวมขององค์ประกอบทั้งหมดในรายการ
7 สินค้า: เลขที่รายการ -> เลขที่ ตรวจสอบว่ารายการว่างเปล่า
8 เรียงลำดับ: รายการเทียบเคียง -> รายการเทียบเคียง เรียงลำดับรายการจากน้อยไปมาก
9 concat: รายการ (List a) -> List a รวมรายการต่างๆเข้าด้วยกัน
10 ผนวก: List a -> List a -> List a รวมสองรายการเข้าด้วยกัน
11 ช่วง: Int -> Int -> รายการ Int ส่งคืนรายการตัวเลขตั้งแต่ต้นจนจบ
12 ตัวกรอง: (a -> Bool) -> List a -> List a กรองรายการค่าจากรายการอินพุต
13 หัว: รายการ a -> อาจจะอาจจะเป็น ส่งคืนองค์ประกอบแรกจากรายการ
14 หาง: รายการ a -> อาจจะบางที (รายการ a) ส่งคืนองค์ประกอบทั้งหมดยกเว้นส่วนหัว

มันว่างเปล่า

ฟังก์ชันนี้จะคืนค่าจริงหากรายการว่างเปล่า

ไวยากรณ์

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

concat

ฟังก์ชันนี้จะรวมรายการต่างๆเข้าด้วยกันเป็นรายการเดียว

ไวยากรณ์

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)

การใช้ตัวดำเนินการจุดด้อย

ตัวดำเนินการจุดด้อย (::) เพิ่มองค์ประกอบที่ด้านหน้ารายการ

ภาพประกอบ

> 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