รูปแบบฟังก์ชัน

เสร็จสมบูรณ์เมื่อ

ที่ผ่านมา คุณได้นํานิพจน์ที่ซ้ําๆ และใส่นิพจน์เหล่านั้นลงในฟังก์ชันแล้ว รหัสของคุณตอนนี้ดูดีขึ้นและอ่านได้ง่ายขึ้น เมื่อคุณคุ้นเคยกับการใช้ฟังก์ชันมันคุ้มค่าที่จะดูรูปแบบที่มีประสิทธิภาพบางอย่างที่มีอยู่ในพื้นที่นี้ เมื่อใช้รูปแบบเหล่านี้ คุณจะได้รับโค้ดที่ง่ายต่อการอ่านและคงไว้

เชิงประกาศและเชิงกําหนด

เมื่อคุณเริ่มเขียนโค้ด คุณอาจเขียนนิพจน์ได้มากที่สุด จากนั้น คุณเขียนนิพจน์อื่นตามด้วยอีกนิพจน์หนึ่ง คุณมุ่งเน้นไปที่การแก้ปัญหา และคุณกําลังเจาะจงวิธีการแก้ปัญหานั้น วิธีการนี้เรียกว่าวิธีการ เชิง เชิงกําหนด ไม่มีอะไรผิดปกติเพราะช่วยแก้ปัญหาที่มือได้ แต่มีอีกเส้นทางที่จะนําไปใช้ ซึ่งเป็นแนวทาง เชิงประกาศ คุณสามารถดูตัวอย่างของวิธีเชิงประกาศเมื่อคุณคิวรีฐานข้อมูลโดยใช้ SQL

นี่คือตัวอย่างนิพจน์:

SELECT * 
FROM Students s
WHERE s.Location = "Ohio" 

สิ่งที่ทําให้รหัสนี้เปิดเผยคือ คุณขอ ว่าคุณต้องการ อะไร แต่คุณไม่ได้ระบุ วิธี ที่คุณต้องการให้ปัญหาสามารถแก้ไขได้ คุณออกจาก วิธีการ ไปยัง SQL

คุณยังสามารถใช้วิธีนี้กับ F# ได้ โค้ดต่อไปนี้ใช้วิธีการที่เปิดเผย:

let studentsFromOhio = 
    allStudents  
    |> filterLocation "Ohio"

ในโค้ดก่อนหน้า คุณดําเนินการกับข้อมูลและถามสิ่งที่คุณต้องการโดยไม่ต้องเจาะจงเกี่ยวกับวิธีการที่คุณต้องการให้ดําเนินการ เมื่อโค้ดของคุณมีลักษณะเหมือนกับตัวอย่างก่อนหน้า คุณสามารถอ่านและให้เหตุผลได้อย่างง่ายดาย เมื่อต้องการเข้าถึงจุดนี้ มาดูรูปแบบที่เป็นประโยชน์บางอย่างที่สนับสนุนใน F#

รูปแบบการทํางาน

มีรูปแบบที่มีประโยชน์บางอย่างใน F# ที่คุณสามารถใช้เพื่อ วิธีการทํางานของ มากขึ้น เราจะครอบคลุมรูปแบบต่อไปนี้:

  • องค์ประกอบภาพ : องค์ประกอบประกอบด้วยฟังก์ชั่นหลายอย่างเข้าด้วยกันเป็นฟังก์ชันเดียว
  • Pipeline: ไปป์ไลน์เริ่มต้นด้วยค่า แล้วเรียกใช้ฟังก์ชันหลายฟังก์ชันตามลําดับโดยใช้ผลลัพธ์จากฟังก์ชันหนึ่งเป็นข้อมูลป้อนเข้าสําหรับฟังก์ชันถัดไป

ส่วนประกอบ

องค์ประกอบเป็นเรื่องเกี่ยวกับการรวมฟังก์ชั่นและนําไปใช้ทีละอันตามลําดับ ตัวดําเนินการองค์ประกอบจะใช้สองฟังก์ชันและส่งกลับฟังก์ชันใหม่

เมื่อคุณเขียนโค้ด คุณมักจะพบว่าตัวเองเรียกฟังก์ชันหนึ่งและอีกฟังก์ชันหนึ่งหลังจากนั้น ตัวอย่างเช่น คุณอาจต้องการเรียงลําดับรายการและกรองข้อมูลผลิตภัณฑ์ทั้งหมดที่อยู่ในส่วนลด

ในตัวอย่างต่อไปนี้ ฟังก์ชัน add2() ถูกเรียก และผลลัพธ์จะถูกป้อนให้กับฟังก์ชัน multiply3()

let add2 a = a + 2
let multiply3 a = a * 3 
let addAndMultiply a =
    let sum = add2 a
    let product = multiply3 sum
    product

printfn "%i" (addAndMultiply 2) // 12

รูปแบบนี้เป็นรูปแบบทั่วไปดังนั้น F# มีตัวดําเนินการ ตัวดําเนินการ >> ช่วยให้คุณสามารถรวมฟังก์ชันสองรายการขึ้นไปเป็นฟังก์ชันที่มีขนาดใหญ่กว่าหนึ่งฟังก์ชันได้ ด้วยการใช้ตัวดําเนินการ >> คุณสามารถลดความซับซ้อนของโค้ดก่อนหน้าได้ ดังนี้:

let add2 a = a + 2
let multiply3 a = a * 3 
let addAndMultiply = add2 >> multiply3

printfn "%i" (addAndMultiply 2) // 12

ฟังก์ชันที่รวมกัน addAndMultiply() ใช้ฟังก์ชันที่ประกอบด้วยจากซ้ายไปขวา ในตัวอย่างนี้ add2() เกิดขึ้นก่อนและ multiply3() เกิดขึ้นล่าสุด

ท่อ

ตัวดําเนินการไปป์ไลน์ |> ใช้ฟังก์ชันและอาร์กิวเมนต์และส่งกลับค่า มาดูความแตกต่างของไปป์ไลน์จากองค์ประกอบด้วยตัวอย่างนี้:

let list = [4; 3; 1]
let sort (list: int list) = List.sort list
let print (list: int list)= List.iter(fun x-> printfn "item %i" x) list

list |> sort |> print // item 1 item 3 item 4

ในบรรทัดสุดท้ายของโค้ด คุณเริ่มต้นด้วยรายการของจํานวนเต็ม listซึ่งทําหน้าที่เป็นข้อมูลป้อนเข้าไปยังฟังก์ชันแรก sort() ผลลัพธ์ของการดําเนินการดังกล่าวจะถูกป้อนลงใน print() ความแตกต่างหลักระหว่างไปป์ไลน์และองค์ประกอบคือด้วยไปป์ไลน์คุณเริ่มต้นด้วยข้อมูลบางอย่างซึ่งเป็นรายการของจํานวนเต็มในกรณีนี้และจากนั้นคุณนําผ่านชุดฟังก์ชัน