คำถามติดแท็ก currying

15
ประโยชน์ของแกงกะหรี่คืออะไร?
ฉันเพิ่งเรียนรู้เกี่ยวกับการแกงและในขณะที่ฉันคิดว่าฉันเข้าใจแนวคิดฉันไม่เห็นประโยชน์ใหญ่หลวงใด ๆ ในการใช้มัน เป็นตัวอย่างเล็ก ๆ น้อย ๆ ฉันใช้ฟังก์ชั่นที่เพิ่มสองค่า (เขียนเป็น ML) รุ่นที่ไม่มีการปิดบังจะเป็น fun add(x, y) = x + y และจะเรียกว่าเป็น add(3, 5) ในขณะที่เวอร์ชันแกงกะหรี่คือ fun add x y = x + y (* short for val add = fn x => fn y=> x + y *) และจะเรียกว่าเป็น add 3 5 มันดูเหมือนว่าฉันจะเป็นเพียงน้ำตาล …

1
วิธีการล่ามโซ่ที่ต้องการเพียงหนึ่งพารามิเตอร์ต่อวิธีเทียบเท่ากับการแกง?
ฉันได้เล่นกับ Ruby เมื่อเร็ว ๆ นี้และพบว่าตัวเองสงสัยว่าในภาษาเชิงวัตถุบริสุทธิ์ (และแม้กระทั่งผู้ที่ไม่บริสุทธิ์) วิธีการที่ใช้พารามิเตอร์เดียวเท่านั้น รูปแบบ? ถ้าไม่ทำไมล่ะ ฉันขอขอบคุณคำตอบที่ละเอียดและละเอียดมากแม้ในหัวข้อนี้

3
เป็นไปได้ไหมที่จะมีฟังก์ชั่นการแกงและการแปรผันในเวลาเดียวกัน?
ฉันกำลังคิดเกี่ยวกับการทำให้ฟังก์ชั่นการแกงและการเปลี่ยนแปลงทั้งสองมีอยู่ในภาษาการเขียนโปรแกรมฟังก์ชั่นแบบไดนามิก แต่ฉันสงสัยว่ามันเป็นไปได้หรือไม่ นี่คือรหัสเทียมบางส่วน: sum = if @args.empty then 0 else @args.head + sum @args.tail ซึ่งคาดว่าจะรวมข้อโต้แย้งของมันทั้งหมด แล้วถ้าตัวเองจะได้รับการรักษาเป็นจำนวนมากแล้วผลที่ได้คือsum 0ตัวอย่างเช่น, sum + 1 เท่ากับ 1 โดยสมมติว่า+สามารถใช้กับตัวเลขได้ อย่างไรก็ตามแม้sum == 0จะเป็นจริงsumจะยังคงรักษาคุณค่าและคุณสมบัติการทำงานของมันไม่ว่าจะมีอาร์กิวเมนต์เท่าใด (เช่น "นำไปใช้บางส่วน" และ "variadic" ในเวลาเดียวกัน) ตัวอย่างเช่นถ้าฉันประกาศ g = sum 1 2 3 จากนั้นgเท่ากับ6แต่เรายังคงสามารถใช้ต่อไปgได้ ตัวอย่างเช่นg 4 5 == 15เป็นจริง ในกรณีนี้เราไม่สามารถแทนที่วัตถุgด้วยตัวอักษร6เพราะแม้ว่าพวกเขาให้ค่าเดียวกันเมื่อถือว่าเป็นจำนวนเต็มพวกเขามีรหัสที่แตกต่างกันภายใน หากการออกแบบนี้ถูกใช้ในภาษาการเขียนโปรแกรมจริงมันจะทำให้เกิดความสับสนหรือความกำกวมหรือไม่?

4
มีอะไรพิเศษเกี่ยวกับการแกงหรือการใช้งานบางส่วน
ฉันได้อ่านบทความเกี่ยวกับการเขียนโปรแกรมฟังก์ชั่นทุกวันและพยายามที่จะใช้แนวทางปฏิบัติบางอย่างให้มากที่สุด แต่ฉันไม่เข้าใจสิ่งที่เป็นเอกลักษณ์ในการประยุกต์ใช้การ currying หรือบางส่วน ใช้โค้ด Groovy นี้เป็นตัวอย่าง: def mul = { a, b -> a * b } def tripler1 = mul.curry(3) def tripler2 = { mul(3, it) } ฉันไม่เข้าใจความแตกต่างระหว่างtripler1และtripler2คืออะไร พวกเขาทั้งคู่ไม่เหมือนกันหรือ 'การแกง' ได้รับการสนับสนุนในภาษาที่ใช้งานได้จริงหรือบางส่วนเช่น Groovy, Scala, Haskell เป็นต้น แต่ฉันสามารถทำสิ่งเดียวกันได้ (แกงเผ็ดซ้าย, แกงกะหรี่ขวา, แกงกะหรี่หรือแอปพลิเคชั่นบางส่วน) เพียงแค่สร้างชื่อหรือไม่ระบุชื่อ ฟังก์ชั่นหรือการปิดที่จะส่งต่อพารามิเตอร์ไปยังฟังก์ชั่นเดิม (เช่นtripler2) ในภาษาส่วนใหญ่ (แม้ C. ) ฉันทำอะไรบางอย่างหายไปหรือเปล่า มีสถานที่ที่ฉันสามารถใช้แอปพลิเคชั่นการแกงและบางส่วนในแอปพลิเคชัน …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.