Mengapa kata kunci rec diperlukan di F #?

28

Dalam F # perlu menggunakan reckata kunci. Dalam Haskell tidak perlu secara eksplisit mengetahui apakah fungsi yang diberikan bersifat rekursif atau tidak.

Mengingat peran rekursi dalam pemrograman fungsional, desain F # agak aneh bagi saya. Apakah ini keputusan desain bahasa yang baik atau hanya ada karena alasan historis atau karena kendala implementasi?

Simon Bergot
sumber

Jawaban:

16

Ada perbedaan yang melekat dalam Haskell dan F # semantik. Di Haskell, panggilan fungsi tidak melakukan perhitungan nyata, tetapi mengalokasikan objek tumpukan yang dikenal sebagai 'thunk'. Sangat baik bagi seorang pencuri untuk memiliki tautan ke pencuri itu sendiri atau pencuri lain. Namun, dalam F #, panggilan fungsi adalah panggilan yang sebenarnya, membuat ekspresi seperti let x = 1 : 2 : x in xtidak valid - karena xharus dibangun sebelum 1 : 2 : xdibangun. Namun, definisi ini masih kurang lebih masuk akal untuk daftar tak terbatas, beberapa cara untuk mendefinisikannya harus ada. Di sinilah letak akar untuk rec. Jika Anda menginginkan lebih, cari dan baca semantik operasional untuk SML dan Haskell - ini berbeda.

permeakra
sumber
2
AFAIK, Haskell sengaja tidak memiliki semantik operasional.
dan_waterworth
@dan_waterworth tidak mungkin dikompilasi tanpa didefinisikan semantik operasional.
permeakra
8
Bahasa Haskell tidak mendefinisikan semantik operasional, tetapi sebaliknya menyediakan semantik denotasi. Ketika Anda membangun kompiler, semantik operasional didefinisikan secara implisit, tetapi ini tidak berarti bahwa itu adalah bagian dari standar bahasa Haskell.
dan_waterworth
6
@dan_waterworth Dalam praktiknya hanya ada satu implementasi dan standar bahasa Haskell: ghc, serta hanya ada satu standar F #: implementasi Microsoft untuk itu. Jadi secara teori Anda mungkin benar, tetapi berlatih adalah binatang yang sama sekali berbeda.
permeakra
19

Ini pertanyaan sudah dijawab di SO , dan itu termasuk beberapa latar belakang sejarah yang kuat mengapa "rec" digunakan.

Berikut adalah kutipan penting untuk anak cucu:

Fungsi tidak rekursif secara default dalam keluarga bahasa CAML Prancis (termasuk OCaml). Pilihan ini memudahkan untuk menggantikan fungsi (dan variabel) definisi menggunakan membiarkan dalam bahasa-bahasa tersebut karena Anda dapat merujuk ke definisi sebelumnya di dalam tubuh definisi baru. F # mewarisi sintaks ini dari OCaml.

Chris Pitman
sumber
12

Rekursif letmendefinisikan semantik yang jauh lebih rumit daripada semantik yang normal. Oleh karena itu, demi kesederhanaan dan desain bahasa yang bersih, ada alasan bagus untuk memiliki keduanya, sama seperti memiliki yang terpisah let, let*dan letrecdalam Skema.

Sederhana let x = y in zsama dengan ((fun x -> z) y). Let rekursif jauh lebih rumit dan mungkin melibatkan penggunaan combinator titik tetap.

Logika SK
sumber