Orijinal ML'nin Fransız ve İngiliz torunları farklı seçimler yaptı ve seçimleri on yıllar boyunca modern varyantlara miras kaldı. Yani bu sadece miras ama bu dillerdeki deyimleri etkiliyor.
İşlevler, Fransızca CAML dil ailesinde (OCaml dahil) varsayılan olarak yinelemeli değildir. Bu seçim, letbu dillerde kullanılan işlev (ve değişken) tanımlarının yerini almayı kolaylaştırır çünkü yeni bir tanımın gövdesi içinde önceki tanıma başvurabilirsiniz. F # bu sözdizimini OCaml'den devraldı.
Örneğin, OCaml'deki pbir dizinin Shannon entropisini hesaplarken işlevin yerini almak:
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Üst düzey shannonişlev argümanının p, vücudun ilk satırında bir başkası ve ardından vücudun pikinci satırında bir başkası tarafından nasıl değiştirildiğine dikkat edin.
Tersine, ML ailesinin İngiliz SML şubesi diğer seçimi aldı ve funSML'nin -bound işlevleri varsayılan olarak özyinelemeli. Çoğu işlev tanımının, işlev adlarının önceki bağlamalarına erişmesi gerekmediğinde, bu daha basit kodla sonuçlanır. Ancak, superceded fonksiyonları (farklı adlar kullanmak için yapılır f1, f2kapsamını kirletir ve mümkün kılan vs.) yanlışlıkla bir fonksiyonun yanlış "sürümüne" çağırmak. Ve şimdi örtük olarak özyinelemeli funbağlı işlevler ile özyinelemeli olmayan bağlı işlevler arasında bir tutarsızlık var val.
Haskell, tanımlar arasındaki bağımlılıkları saf olmalarını kısıtlayarak çıkarmayı mümkün kılar. Bu, oyuncak örneklerini daha basit gösterir, ancak başka yerlerde ciddi bir maliyetle gelir.
Ganesh ve Eddie'nin verdiği cevapların kırmızı ringa balığı olduğuna dikkat edin. let rec ... and ...Tür değişkenleri genelleştirildiğinde etkilediği için neden işlev gruplarının bir devin içine yerleştirilemeyeceğini açıkladılar . Bunun recSML'de varsayılan olmakla ilgisi yoktur, ancak OCaml ile ilgisi yoktur .