มีฟังก์ชั่นfที่รับอาร์กิวเมนต์x 1 , x 2 , …, x n
- เช่น f: X 1 × X 2 ×…× X n → Y
- ความดีความชอบนิยามใหม่ของFเป็นฟังก์ชั่นการใช้อาร์กิวเมนต์เดียว1ซึ่งแมปไปยังฟังก์ชั่นอื่น เทคนิคนี้มีประโยชน์สำหรับการใช้งานบางส่วนเช่นฟังก์ชั่นcurried ที่เราสามารถเขียนได้pow
exp = pow(e)
ตัวอย่าง
สมมติว่าเรามีฟังก์ชั่นfต่อไปนี้รับสามอาร์กิวเมนต์ ( f: X 1 × X 2 × X 3 → Y ):
def f(a,b,c):
return a + b * c
การปิดฟังก์ชั่นนี้ทำให้เรามีf_curry: X 1 → (X 2 → (X 3 → Y))ถ้าเราจะเรียกฟังก์ชันนั้นสองครั้งf_curry(1)(2)
เราจะได้รับฟังก์ชัน ( h
) เทียบเท่ากับการคืนค่าต่อไปนี้:
def h(c):
return 1 + 2 * c
ฟังก์ชั่น curried f
สามารถเขียนได้เช่นนี้ (Python 3):
def f_curry(a):
def g_curry(b):
def h(c):
return a + b * c
return h
return g_curry
ท้าทาย
ความท้าทายของคุณคือการทำหน้าที่ตามที่อธิบายไว้ข้างต้นนี่คือกฎ:
- อินพุตจะเป็นฟังก์ชันแบล็กบ็อกซ์ซึ่งมีอาร์กิวเมนต์อย่างน้อย 2 ข้อ
- ฟังก์ชั่นอินพุตจะมีจำนวนอาร์กิวเมนต์ที่คงที่เสมอ (ไม่เหมือน
printf
หรือคล้ายกันหมายเหตุ: คุณต้องรองรับฟังก์ชั่นที่มีอาร์กิวเมนต์จำนวนใด ๆ ≥2) - หากภาษาของคุณใช้ฟังก์ชัน curried ตามค่าเริ่มต้น (เช่น Haskell) คุณอาจคาดหวังว่าฟังก์ชันอินพุตจะถูกกำหนดเหนือN -tuples แทนที่จะเป็น "ฟังก์ชันลำดับสูงกว่า"
- คุณอาจใช้จำนวนอาร์กิวเมนต์เป็นอินพุต
- เอาต์พุตจะเท่ากับค่าอินพุตที่ curried *
- คุณอาจสันนิษฐานว่าฟังก์ชั่นการส่งออกจะเป็นเพียง:
- เรียกว่ามีน้อยหรือเท่ากับจำนวนของอาร์กิวเมนต์ที่ฟังก์ชั่นการป้อนข้อมูลจะใช้เวลา
- เรียกว่ามีข้อโต้แย้งของประเภทที่เหมาะสม
* นี้จะหมายถึงสำหรับการป้อนข้อมูลf
ที่มีN
ข้อโต้แย้งและเอาท์พุทh
ว่าสำหรับข้อโต้แย้งที่ถูกต้องทั้งหมดก็ถือได้ว่าa1,…,aN
f(a1,a2,…,aN) == h(a1)(a2)…(aN)
def f(a,b,c): return a + b * c
และเอาต์พุตคือdef f_curry(a): def g_curry(b): def h(c): return a + b * c return h return g_curry
อะไร
f
(ซึ่งถูกกำหนดไว้ที่ใดที่หนึ่ง) f_curry
และการส่งออกควรเป็นสิ่งที่เทียบเท่ากับ หรือการป้อนข้อมูลที่จะเป็นและเอาท์พุทเทียบเท่าฟังก์ชั่นlambda a,b,c: a+b*c
f_curry