Dot Operator ใน Haskell
ฉันพยายามทำความเข้าใจว่าตัวดำเนินการ dot ทำอะไรในรหัส Haskell นี้:
sumEuler = sum . (map euler) . mkList
คำตอบสั้น ๆ
รหัสเทียบเท่าที่ไม่มีจุดนั่นเป็นเพียง
sumEuler = \x -> sum ((map euler) (mkList x))
หรือไม่มีแลมด้า
sumEuler x = sum ((map euler) (mkList x))
เนื่องจากจุด (.) แสดงถึงองค์ประกอบของฟังก์ชัน
คำตอบที่ยาวขึ้น
ก่อนอื่นมาทำให้การใช้งานบางส่วนง่ายขึ้นeuler
เพื่อmap
:
map_euler = map euler
sumEuler = sum . map_euler . mkList
ตอนนี้เรามีจุด จุดเหล่านี้บ่งชี้อะไร
จากแหล่งที่มา :
(.) :: (b -> c) -> (a -> b) -> a -> c
(.) f g = \x -> f (g x)
ดังนั้นจึง(.)
เป็นผู้ประกอบการเขียน
เขียน
ในทางคณิตศาสตร์เราอาจเขียนองค์ประกอบของฟังก์ชัน f (x) และ g (x) นั่นคือ f (g (x)) เป็น
(f ∘ก.) (x)
ซึ่งสามารถอ่านได้ว่า "f ประกอบด้วย g"
ดังนั้นใน Haskell สามารถเขียน f ∘ g หรือ f ประกอบด้วย g ได้:
f . g
การจัดองค์ประกอบเป็นแบบเชื่อมโยงซึ่งหมายความว่า f (g (h (x))) ซึ่งเขียนด้วยตัวดำเนินการองค์ประกอบสามารถเว้นวงเล็บไว้โดยไม่มีความคลุมเครือ
นั่นคือเนื่องจาก (f ∘ g) ∘ h เทียบเท่ากับ f ∘ (g ∘ h) เราจึงสามารถเขียน f ∘ g ∘ h ได้
วนกลับ
วนกลับไปที่การทำให้เข้าใจง่ายก่อนหน้านี้สิ่งนี้:
sumEuler = sum . map_euler . mkList
หมายความว่าsumEuler
เป็นองค์ประกอบที่ไม่ได้ใช้ของฟังก์ชันเหล่านั้น:
sumEuler = \x -> sum (map_euler (mkList x))