F # 'da rec anahtar sözcüğü neden gerekli?


28

F # 'da recanahtar kelimeyi kullanmak gereklidir . Haskell'de, belirli bir fonksiyonun özyinelemeli olup olmadığını açıkça söylemek gerekmez.

Fonksiyonel programlamada özyinelemenin rolü göz önüne alındığında, F # tasarımı bana biraz tuhaf geliyor. İyi bir dil tasarım kararı mıdır yoksa yalnızca tarihsel nedenlerden dolayı mı yoksa uygulama kısıtlaması nedeniyle mi var?

Yanıtlar:


16

Haskell ve F # anlambiliminde doğal bir fark vardır. Haskell'de, bir işlev çağrısı gerçek bir hesaplama yapmaz, ancak 'thunk' olarak bilinen bir yığın nesnesini ayırır. Bir thunk'un kendisiyle veya başka bir thunk ile bağlantısı olması gayet iyi. Bununla birlikte, F # 'da, bir işlev çağrısı gerçek bir çağrıdır, ifadeleri let x = 1 : 2 : x in xgeçersiz gibi yapar - daha xönce 1 : 2 : xinşa edilmesini gerektirdiği gibi . Bununla birlikte, sonsuz liste için hala az ya da çok makul bir tanımdır, onu tanımlamanın bir yolu vardır. İşte bunun için kökler rec. Daha fazlasını istiyorsanız, SML ve Haskell için operasyonel semantikleri arayın ve okuyun - farklıdır.


2
AFAIK, Haskell bilerek operasyonel bir semantiye sahip değildir.
dan_waterworth

@ dan_waterworth tanımlanmış operasyonel anlamsız olmadan derlemek imkansız.
permeakra,

8
Haskell dili operasyonel bir semantik tanımlamıyor, bunun yerine bir kimlilik anlambilimi sağlıyor. Bir derleyici kurduğunuzda, işlemsel bir anlamsallık tam olarak tanımlanır, ancak bu Haskell dil standardının bir parçası olduğu anlamına gelmez.
dan_waterworth

6
@ dan_waterworth Uygulamada Haskell dilinin yalnızca bir uygulaması ve standardı vardır: ghc, ayrıca sadece bir F # standardı vardır: Microsoft'un uygulaması. Yani teorik olarak haklı olabilirsin, ama uygulama tamamen farklı bir canavar.
permeakra

19

Bu soru SO'da cevaplandırılmıştır ve “rec” in neden kullanıldığına dair bazı güçlü tarihsel geçmişe sahiptir.

Posterity için önemli teklif:

İşlevler varsayılan olarak Fransız CAML dil ailesinde (OCaml dahil) özyinelemeli değildir. Bu seçenek, bu dillerde let kullanarak işlev (ve değişken) tanımlarının üst üste getirilmesini kolaylaştırır, çünkü yeni bir tanımın gövdesi içindeki önceki tanımlamaya başvurabilirsiniz. F # bu sözdizimini OCaml'den devraldı.


12

Özyinelemeli let, normal olandan anlamlı derecede daha karmaşık bir anlam ifade eder. Bu nedenle, basitlik ve temiz bir dil tasarımı uğruna, her ikisine de ayrı olmakla aynı olması için iyi bir neden var.let , let*ve letrecŞemada.

Basit let x = y in zeşittir ((fun x -> z) y). Özyinelemeli bir izin çok daha karmaşıktır ve sabit nokta birleştirici kullanmayı içerebilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.