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.