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, let
bu 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 p
bir 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 shannon
işlev argümanının p
, vücudun ilk satırında bir başkası ve ardından vücudun p
ikinci 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 fun
SML'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
, f2
kapsamı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 fun
bağ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 rec
SML'de varsayılan olmakla ilgisi yoktur, ancak OCaml ile ilgisi yoktur .