วันศุกร์ที่ ๑๑ เมษายน พ.ศ. ๒๕๕๑

GHC cont..

เราสามารถ สร้าง 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 ความคิดเห็น: