Saya baru mengenal OCAML dan ketika menelusuri beberapa kode saya melihat yang berikut:

  let catch f m = M.bind m ~f:(
      function Error e -> f e
             | Ok x -
    )

Dari apa yang dapat saya lakukan, ini mendefinisikan blok coba / tangkap (pemahaman saya adalah bahwa OCAML tidak menggunakan blok tangkapan terpisah). M.bind Apakah operator bind monadic yang meneruskan hasil M ke perhitungan ke-2. Manual Referensi OCAML mengatakan bahwa ~ digunakan untuk memberi label argumen untuk kemudahan memahami tanda tangan tipe mereka dalam dokumentasi. Namun demikian itu berarti perhitungan kedua ("function .." "juga diberi label f ??

0
N.S. 3 April 2021, 20:40

1 menjawab

Jawaban Terbaik

Argumen berlabel dikaitkan dengan fungsi tertentu. Ini berarti bahwa fungsi memiliki argumen dengan nama. Ketika Anda menelepon fungsi, Anda menentukan nama dan nilainya seperti ini:

 myfun ~name: value

Jika panggilan ini valid, maka kita tahu itu myfun memiliki argumen dengan nama name.

Sebagai perbandingan, ketika Anda memanggil fungsi tanpa argumen berlabel, panggilan terlihat seperti ini:

myotherfun othervalue

Definisi fungsi yang mengambil argumen bernama terlihat seperti ini:

let myfun ~name =
    ... expression involving name ...

Misalnya fungsi ini membuat daftar singleton keluar dari apa pun yang Anda lewati:

let myfun ~name = [name]

Panggilan untuk fungsi ini terlihat sebagai berikut di OCAML Toplevel (RPL):

# myfun ~name: 44;;
- : int list = [44]

Kuncinya adalah ini memungkinkan Anda untuk menentukan argumen dengan nama daripada dengan posisi ketika Anda memanggil fungsi. Anda perlu menentukan nama yang diharapkan fungsinya. Tetapi jika suatu fungsi memiliki lebih dari satu argumen bernama Anda dapat menentukannya dalam urutan apa pun.

Tidak benar bahwa nama-nama ini hanya digunakan dalam dokumentasi OCAML. Apa yang dikatakan manual kepada Anda adalah bahwa argumen bernama bertindak sebagai dokumentasi yang baik tentang apa argumen yang berbeda digunakan. Ini terutama berlaku untuk fungsi yang mengambil banyak argumen, dan bahkan lebih terutama jika beberapa dari mereka adalah tipe yang sama. Menggunakan nama menghindari jenis kesalahan di mana Anda menentukannya dalam urutan yang salah.

Jadi, Anda menelepon fungsi M.bind yang memiliki argumen berlabel dengan nama f. Secara konvensional, argumen bernama f digunakan untuk memberikan fungsi sebagai argumen, yang memang apa yang terjadi di sini.

Begitu; Pertanyaan Anda tampaknya adalah apakah argumen kedua diberi label. Argumen kedua M.bind diberi label, YES. Tetapi nilainya bisa berupa apa saja. Nilai tidak terpengaruh oleh label fungsi yang sedang diteruskan. Selanjutnya, Anda dapat melihat definisi fungsi function Error ... dan melihat bahwa itu tidak memiliki argumen berlabel. Ini hanya fungsi yang menerima nilai result.

Untuk mengulangi, ini adalah definisi fungsi:

function Error -> f e | Ok x -> g x

Jadi kita tahu segala sesuatu yang perlu diketahui tentang fungsi ini. Jelas tidak memiliki argumen bernama.

0
Jeffrey Scofield 5 April 2021, 02:34