การประกาศ
List
นอกจากจะทำได้ตามวิธีปรกติแล้ว Haskell ยังทำท่านี้ได้อีกด้วย
ค่าที่เพิ่มจะเพิ่มขึ้นครั้งละ 1 หน่วย (ถ้าตัวเลขก็คือ
+1
ถ้าเป็นตัวอักษรก็คือตัวอักษรถัดไป) เราสามารถแก้ไขค่าที่จะเพิ่มขึ้นได้โดยบอกสมาชิกตัวถัดไปใน
List
นี้แทน
สมาชิกตัวสุดท้ายที่บอกขอบเขตบนนั้น อาจอยู่หรือไม่อยู่ใน
List
ที่สร้างเสร็จก็ได้ แต่จะไม่มีสมาชิกที่มีค่าใหญ่กว่านี้ครับ
ส่วนการประกาศค่าแบบลดลงนั้น ไม่สามารถบอกแค่
[10..1]
ได้ ต้องบอกสมาชิกตัวถัดมาด้วย
หมายเหตุว่าให้ระวังการประกาศ
List
แบบนี้กับเลขทศนิยม เพราะ bug ของตัว Haskell เองทำให้อาจมีสมาชิกที่ใหญ่กว่าขอบเขตบนโผล่มาได้ครับ
อนึ่ง เราสามารถละส่วนขอบเขนบนได้ โดย Haskell จะเอาขอบเขตบนของ type นั้นมาเติมให้เอง เช่น
ปล่อยไว้ซักพัก จะเห็นว่า
List
ที่สร้างขึ้นนี้วิ่งไปจบที่ตัวอักษรซักตัวเอง และถ้าสงสัยว่าขอบเขตบนนั้นคืออะไร ก็สามารถหาได้โดย
แต่สำหรับข้อมูลบาง type ที่ไม่มีขอบเขตบน (เช่น
Integer
) เมื่อสั่ง
[1..]
ตัวเลขจะวิ่งขี้นไปเรื่อยๆ ไม่มีที่สิ้นสุดครับ (เป็น
List
ที่ยาวเป็นอนันต์)
List
ที่ยาวเป็นอนันต์อาจฟังดูไม่มีประโยชน์ เพราะมันคล้ายว่าเราสั่งให้โปรแกรมไปสร้าง
List
ที่ไม่มีวันเสร็จ (และโปรแกรมก็จะไม่สามารถไปทำงานอย่างอื่นต่อได้) อย่างไรก็ตาม การดึงสมาชิกเพียงบางส่วนจากออกมานั้นเป็นไปได้ใน Haskell เพราะมันจะไม่พยายามสร้าง
List
นั้นๆ จนเสร็จ แต่จะสร้างเพียงเท่าที่เราขอไปใช้ต่อเท่านั้น
ฟังก์ชันที่ใช้เพื่อขอสมาชิกเพียงไม่กี่ตัวแรกของ
List
จากทางด้านหน้าคือ
take
ส่วน
drop
นั้นจะใช้เพื่อทิ้งสมาชิกตัวหน้าออกไป
(
drop
เพียงอย่างเดียวนั้นไม่ค่อยมีประโยชน์กับ
List
ที่ยาวเป็นอนันต์ครับ)
ฟังก์ชันอีกกลุ่มที่ทำหน้าที่เช่นเดียวกันนี้ เพียงแต่เปลี่ยนจากจำนวนสมาชิกที่ต้องการแน่นอน ไปเป็นการตรวจสอบค่าสมาชิกว่าตรงเงื่อนไขหรือยัง คือ
takeWhile
และ
dropWhile
ย้ำอีกทีว่าฟังก์ชันพวกนี้จะเริ่มทำงานจากด้านหัว และคืนค่าทันทีเมื่อเงื่อนไขครบ เห็นได้จาก
dropWhile (/=3)
ที่ทิ้งเลข
[1,2]
เฉพาะทางด้านหัวเท่านั้น
นอกจากจะใช้การประกาศ
List
ตามด้านบนเพื่อสร้าง
List
ที่ยาวอนันต์ได้แล้ว ยังสามารถสร้าง
List
ที่ยาวเป็นอนันต์โดยใช้ฟังก์ชันเหล่านี้
cycle
รับตัวแปรเป็น
List
ที่จะเอามาทำซ้ำเรื่อยๆ
ส่วน
repeat
จะรับตัวแปรคือสมาชิกตัวเดียวของ
List
ที่จะเอาไปทำซ้ำๆ แต่ถ้ารู้ขนาดที่แน่นอนอยู่แล้ว สามารถใช้ฟังก์ชัน
replicate
แทนได้