ลูกหลานชาวฝรั่งเศสและอังกฤษของ ML ดั้งเดิมได้เลือกทางเลือกที่แตกต่างกันและทางเลือกของพวกเขาได้รับการสืบทอดมาหลายทศวรรษจนถึงรูปแบบที่ทันสมัย ดังนั้นนี่เป็นเพียงมรดก แต่ส่งผลต่อสำนวนในภาษาเหล่านี้
ฟังก์ชันจะไม่เรียกซ้ำตามค่าเริ่มต้นในกลุ่มภาษาฝรั่งเศส CAML (รวมถึง OCaml) ตัวเลือกนี้ทำให้ง่ายต่อการใช้คำจำกัดความของฟังก์ชัน (และตัวแปร) โดยใช้let
ในภาษาเหล่านั้นมากเนื่องจากคุณสามารถอ้างถึงคำจำกัดความก่อนหน้าภายในเนื้อหาของคำจำกัดความใหม่ F # สืบทอดไวยากรณ์นี้จาก OCaml
ตัวอย่างเช่นการใช้ฟังก์ชัน superceding p
เมื่อคำนวณเอนโทรปีของ Shannon ของลำดับใน OCaml:
let shannon fold p =
let p x = p x *. log(p x) /. log 2.0 in
let p t x = t +. p x in
-. fold p 0.0
สังเกตว่าอาร์กิวเมนต์p
ของshannon
ฟังก์ชันลำดับที่สูงกว่าจะถูกแทนที่ด้วยอีกรายการหนึ่งp
ในบรรทัดแรกของเนื้อหาอย่างไรp
ในบรรทัดที่สองของเนื้อหาอย่างไร
ในทางกลับกันสาขา SML ของอังกฤษของกลุ่มภาษา ML ได้ใช้ตัวเลือกอื่นและfun
ฟังก์ชัน -bound ของ SML จะเรียกซ้ำตามค่าเริ่มต้น เมื่อนิยามฟังก์ชันส่วนใหญ่ไม่จำเป็นต้องเข้าถึงการเชื่อมโยงก่อนหน้าของชื่อฟังก์ชันผลลัพธ์นี้จะทำให้โค้ดง่ายขึ้น แต่ฟังก์ชั่นแทนที่จะทำเพื่อให้ใช้ชื่อที่แตกต่างกัน ( f1
, f2
ฯลฯ ) ซึ่งเป็นมลพิษขอบเขตและทำให้มันเป็นไปได้ที่จะเผลอเรียกผิด "รุ่น" ของฟังก์ชั่น และตอนนี้จะมีความแตกต่างระหว่างปริยาย-recursive fun
ฟังก์ชั่น -bound และไม่ใช่ recursive val
ฟังก์ชั่น -bound
Haskell ทำให้สามารถอนุมานการอ้างอิงระหว่างคำจำกัดความได้โดย จำกัด ให้บริสุทธิ์ ทำให้ตัวอย่างของเล่นดูเรียบง่ายขึ้น แต่มีราคาแพงกว่าที่อื่น
สังเกตว่าคำตอบที่พระพิฆเนศและเอ็ดดี้ให้ไว้คือปลาชนิดหนึ่งสีแดง พวกเขาอธิบายว่าเหตุใดกลุ่มของฟังก์ชันจึงไม่สามารถวางไว้ในยักษ์ได้let rec ... and ...
เนื่องจากมีผลต่อเมื่อตัวแปรประเภทได้รับการทำให้เป็นแบบทั่วไป สิ่งนี้ไม่เกี่ยวข้องกับrec
การเป็นค่าเริ่มต้นใน SML แต่ไม่ใช่ OCaml