วิธีการล่ามโซ่ที่ต้องการเพียงหนึ่งพารามิเตอร์ต่อวิธีเทียบเท่ากับการแกง?


15

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

คำตอบ:


14

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

ใน Java วิธีการผูกมัดเป็นเช่น:

String myString = new StringBuilder("Hi ").append(firstName)
                                          .append(" ")
                                          .append(lastName)
                                          .append("!")
                                          .toString();

ดังนั้นการเรียกใช้เมธอด. append () แต่ละรายการจะส่งคืนตัวชี้ไปยังวัตถุ StringBuilder แบบไม่ระบุชื่อ วัตถุนี้เสร็จสมบูรณ์หลังจากแต่ละ. append () และไม่ใช่ฟังก์ชั่น

ในทางตรงกันข้ามใน Scala การประยุกต์ใช้หรือการแกงบางส่วนนั้นเป็นเช่น:

def simple(x:Int, y:Int, z:Int) = x * (y + z)
val simpler = simple(2, _:Int, _:Int)
simpler(3, 4) => 14

(ตัวอย่างที่นำมาจากบล็อกของ Daniel Yankowsky )

simpler()simple()ในตัวอย่างนี้เป็นเสื้อคลุมฟังก์ชั่นสำหรับ simpler()ยังคงเป็นฟังก์ชั่นที่ใช้พารามิเตอร์มากขึ้นก่อนที่จะสามารถประเมินเป็นอะไรก็ได้ยกเว้นรุ่นที่ จำกัด ของตัวเอง

แก้ไข: การอ่านวันนี้ในภายหลังฉันคิดว่า "ฟังก์ชั่น wrapper" เป็นกุญแจสำคัญ แอพพลิเคชั่นการ currying หรือบางส่วนอาจจำลองได้ดีที่สุดใน Java ด้วยวิธีการหุ้ม

public interface Simpler {
    public int apply(int y, int z);
}

public class Simple {
    public int apply(int x, int y, int z) { return x * (y + z); }

    public Simpler partiallyApply(final int x) {
        final simple = this;
        return new Simpler() {
            @Override
            public int apply(int y, int z) {
                // x is the final int parameter to partiallyApply()
                simple.apply(x, y, z);
            }
        }
    }
}

: END-แก้ไข

วิธีการผูกมัดอาจคล้ายกับแอปพลิเคชั่นบางส่วนหรือการแกง แต่สามารถเทียบเท่าได้กับวิธีการที่ส่งกลับวิธีการอื่น ๆ (ค้นหา Functors) แล้ววิธีการจะต้องตั้งค่าด้วยประเภทการส่งคืนที่มีความหมายแบบจำลอง

วิธีการผูกมัดยิ่งใช้บ่อยในการดำเนินการบางอย่างเช่นการประเมินผลขี้เกียจเป็นจะทำกับ "สร้าง" รูปแบบการออกแบบใหม่และคอลเลกชันอินเตอร์เฟซในห้องสมุด Java 8

ฉันหวังว่าจะช่วย


+1: ฉันรู้ว่า แต่ฉันไม่คิดว่าฉันสามารถพูดได้ทุกที่ใกล้เคียงกับที่คุณทำ
Peter Rowell

อธิบายอย่างนี้นี่เป็นเครื่องหมายสีเขียวและ upvote สำหรับปัญหาของคุณ
World Engineer

คำถามเกี่ยวกับตัวอย่างที่ดีมากของ StringBuilder - หากไม่มีการtoString()โทรเราจะไม่เลียนแบบความตั้งใจในการ curating ในการโทรของเราหรือไม่ ฉันแค่พยายามที่จะรับแนวคิดของการ currying ใน OO ตรง
Sridhar Sarnobat

1
@ Sridhar-Sarnobat ฟังก์ชัน curried ส่งคืนฟังก์ชันอื่นที่มีพารามิเตอร์น้อยลง พารามิเตอร์ที่ตัดออกจะเปลี่ยนเป็นค่าคงที่ภายในในฟังก์ชันที่ส่งคืน วัตถุบางอย่างได้รับการปฏิบัติเหมือนฟังก์ชั่นใน Java 8 ซึ่งอาจทำให้เกิดความสับสน แต่ StringBuilder ไม่ใช่หนึ่งในนั้น อืมภายใน StringBuilder append(charSeq)ฟังก์ชั่นเป็นรูปแบบ curried ของinsert(destOffset, charSeq)ฟังก์ชั่นที่destOffsetมักจะมีความยาวของ StringBuilder
GlenPeterson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.