Mari vs di mana di Ocaml / Haskell

Bahasa Ocaml dan Haskell diturunkan dari bahasa ISWIM, dijelaskan dalam artikel terkenal oleh Peter Lendin "700 bahasa pemrograman berikutnya". Di dalamnya, penulis, mulai dari bahasa LISP, membuat bahasa pemrograman baru dan, secara khusus, memperkenalkan kata kunci let



, and



dan where



, yang banyak digunakan dalam bahasa keluarga ML. Cepat atau lambat, setiap orang yang ingin tahu, terlibat dalam pemrograman fungsional, memiliki pertanyaan: mengapa kata kunci yang where



banyak digunakan di Haskell tidak berakar di Ocaml ?





Dari sudut pandang saya, ini terutama disebabkan oleh perbedaan semantik dari bahasa-bahasa ini, yaitu sifat imperatif-energik Ocaml dan kemurnian-kemalasan evaluasi di Haskell (yang secara langsung dan kuat terkait dengan karakter tidak murni / murni. dari bahasa-bahasa ini).





Kedua ekspresi ini, let



dan where



, diturunkan dari (let ...)



bahasa LISP, yang memiliki dua varian bentuk khusus ini: (let ...)



dan (let* ...)



. Variannya (let* ...)



berbeda karena semua binding di blok terjadi secara berurutan dan dapat bergantung satu sama lain:





(let* ((x 3)

        (y (+ x 2))

        (z (+ x y 5)))

       (* x z))








Dalam beberapa dialek Skema, deklarasi variabel dapat diatur ulang secara otomatis oleh penerjemah, jadi tidak perlu untuk menuliskannya dalam urutan yang "benar". Kedua opsi untuk penjilidan, let ... in



dan where



sesuai dengan opsi "lanjutan" ini (let* ...)



. Namun, Ocaml menggunakan kata kunci untuk memisahkan "ikatan paralel" and



, sementara Haskell hanya menempatkannya dalam satu blok.





Jika Anda melihat secara eksklusif pada esensi sesuatu, Anda dapat melihat ekspresi let ... in



dan where



perbedaan dalam dua aspek: tempat di mana pengikatan ditempatkan, dan jumlah ekspresi di blok.





Mengikat nama sebelum dan sesudah digunakan.

- let ... in



, , where



:





let x = 1 in

 x + 1








z = x + 1

 where x = 1








, let ... in Ocaml, , , / . ,





let x = Printf.printf "Hello ";

         "World!"

 in

 Printf.printf "%s" x








. top-level Ocaml, , open



let () = ...







, where non-strict Haskell, term/graph reduction. , where



, :





main = putStrLn (x ++ y)

        where x = "Hello "

              y = "World!"

              z = undefined








: x



y



, . z



, - .





x



, y



, z



let ... in



, Haskell, - z



, . , do



, let



.





shadowing

C let ... in



, Ocaml, Haskell, . where



- :





let x = 1 in

 let y = 1 in

 x + y








z = x + y

 where x = 1

       y = 1








, , , , , , "shadowing". Ocaml shadowing , :





let x = 1 in

 let x = x * 10 in

 x * x








, , :





x := 1;

 x := x * 10;

 return x*x;








Haskell, where



, "", shadowing , . shadowing , top-level , - non-strict . , Haskell





x = x + 1







.





shadowing Ocaml Haskell , Ocaml , Ocaml Haskell (backpack , - t



M



Ocaml ).





Ocaml , -, (.mli) (.ml). , , -, , top-level , . - , Ocaml top-level , . , let ... in (., report_constructor_mismatch https://github.com/ocaml/ocaml/blob/trunk/typing/includecore.ml#L212 )





Haskell , . , , - , , top-level . , where shadowing.





, , - Clean.





, , where



, let ... in



"-", , . , , , Haskell , Ocaml .





, Ocaml, Stdlib



where , , , . , List.mapi



List.rev_map



. , , Ocaml , , - graph rewriting . , Ocaml where



, , Haskell let ... in



.





Jadi, seperti karya teknik yang bagus, bahasa Ocaml dan Haskell menciptakan sinergi antara sintaksis dan semantik. Mengikat pedoman let



dan where



berperan, menekankan model kinerja psevdoimperativnuyu linier dan "malas" (pengurangan grafik). Mereka juga bekerja dengan baik dengan gaya penulisan aplikasi pilihan Anda dan sistem modul terkait.








All Articles