เราสามารถ สร้าง fn ด้วย clauses หลายๆ อันโดยคั่น ด้วยเครื่องหมาย เซมิโคลอน
Prelude> let { f op n [] = n ; f op n (h:t) = h `op` f op n t }
Prelude> f (+) 0 [1..3]
6
Prelude>ดูแล้วงงๆ มะ
ลองถามใน www.codenone.com แล้ว มีคนตอบไว้ดังนี้
Submitted by pphetra on 7 April, 2008 - 07:39.
function นี้ define ไว้ 2 กรณีคือ
กรณีที่ parameter ตัวที่ 3 เป็น empty-array
f op n [] = n
กับกรณี parameter ตัวที่ 3 เป้น array ปกติ
f op n (h:t) = h `op` f op n t
ถ้ายังงงว่าทำไมมันต้อง define เป็น 2 function แบบนี้
แนะนำว่าควรอ่าน concept เรื่อง pattern matching ก่อน
http://en.wikipedia.org/wiki/Pattern_matching
เมื่อเราเรียก f (+) 0 [1..3]
เนื่องจาก array ของเรามีค่า
มันก็จะใช้ function ที่สองในการทำงาน
f (+) 0 (1:[2,3]) = 1 + (f (+) 0 [2,3])
= 1 + (2 + (f (+) 0 [3]))
= ...
= 1 + ... + (f (+) 0 [])
หลังจาก recursive ไปเรื่อยๆ จนถึง f (+) 0 [] (ตัวที่อยู่ที่ท้ายบรรทัด),
กรณีนี้ค่าใน array ของ parameter ตัวที่ 3 มันเป็นค่าว่าง
ดังนั้นเวลามันทำงาน มันก็จะไปตกในเงื่อนไข function แรก
f op n [] = n
==>
f (+) 0 [] = 0

0 ความคิดเห็น:
แสดงความคิดเห็น