SML: declear แต่ไม่ได้กำหนดฟังก์ชัน

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

fun reducemax (i:int * int):int =
    if (#1 i) > (#2 i)
    then lowest(((#1 i)-1), (#2 i))
    else lowest((#1 i), ((#2 i)-1));

fun lowest (i:int * int):int =
    if (#1 i) = (#2 i)
    then (#1 i)
    else reducemax((#1 i), (#2 i));

ฉันรู้ว่าฉันสามารถใช้ Let เพื่อประกาศฟังก์ชันลดสูงสุดภายในค่าต่ำสุดได้ แต่มีวิธีแก้ไขเรื่องนี้ไหม ตัวอย่างเช่นใน C ให้ประกาศฟังก์ชันโดยไม่ต้องกำหนด ฉันเข้าใจว่าฟังก์ชันลดค่าสูงสุดจำเป็นต้องรู้ว่าค่าต่ำสุดจะส่งคืน int และรับอาร์กิวเมนต์ int * int


person Horse SMith    schedule 07.11.2013    source แหล่งที่มา


คำตอบ (1)


เพียงแทนที่ fun ตัวที่สองด้วย and แล้วลบเครื่องหมายอัฒภาคออก สิ่งนี้กำหนดฟังก์ชันแบบเรียกซ้ำร่วมกัน

person seanmcl    schedule 07.11.2013
comment
อ่า ฉันจำได้ลางๆ ว่ากำลังเรียนเรื่องนี้อยู่!! ขอบคุณ มีวิธีอื่นในการทำเช่นนี้ฉันหมายถึงเหมือนใน C หรือไม่? - person Horse SMith; 07.11.2013
comment
ไม่เชิง. นั่นคือคุณไม่สามารถประกาศฟังก์ชันก่อนการใช้งานได้ คุณสามารถใช้ฟังก์ชันแบบเรียกซ้ำร่วมกันได้โดยไม่ต้อง and (หรือแม้แต่ fun) โดยใช้การอ้างอิงฟังก์ชัน โดยมีเทคนิคที่เรียกว่า backpatching ซึ่งเป็นสิ่งที่คล้ายกับสิ่งที่เกิดขึ้นใน C อย่างไรก็ตาม คุณจะต้องหลีกเลี่ยงสิ่งนั้นจนกว่าคุณจะรู้จริงๆ ว่าคุณกำลังทำอะไรอยู่ ในเอสเอ็มแอล - person seanmcl; 07.11.2013