SML: mendeklarasikan tetapi tidak mendefinisikan fungsi

Ini hanya sebuah contoh. Kedua fungsi ini terhubung. Anda benar-benar ingin memanggil yang disebut paling rendah. Ini kemudian akan mengembalikan angka terendah dari keduanya. Ini tentu saja tidak akan berhasil karena pada saat mengkompilasi fungsi penguranganmaks, Anda membuat panggilan ke fungsi yang pada saat itu belum ditentukan disebut fungsi terendah.

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));

Saya tahu saya bisa menggunakan let untuk mendeklarasikan fungsi penguranganmaks di dalam yang terendah, tetapi apakah ada cara untuk mengatasinya? Misalnya seperti di C, deklarasikan fungsi tanpa mendefinisikannya. Saya memahami fungsi penguranganmaks yang perlu diketahui terendah akan mengembalikan int dan mengambil argumen int * int.


person Horse SMith    schedule 07.11.2013    source sumber


Jawaban (1)


Ganti saja fun kedua dengan and dan hapus titik koma. Ini mendefinisikan fungsi yang saling rekursif.

person seanmcl    schedule 07.11.2013
comment
Ah, samar-samar aku ingat mempelajarinya sekarang!! Terima kasih. Apakah ada cara lain untuk melakukan ini, maksud saya seperti di C? - person Horse SMith; 07.11.2013
comment
Tidak terlalu. Artinya, Anda tidak bisa mendeklarasikan fungsi sebelum digunakan. Anda dapat mengimplementasikan fungsi yang saling rekursif tanpa and (atau bahkan fun) menggunakan referensi fungsi, dengan teknik yang disebut backpatching, seperti yang terjadi di C. Namun, Anda sebaiknya menghindarinya sampai Anda benar-benar tahu apa yang Anda lakukan di SML. - person seanmcl; 07.11.2013