2013-03-21 29 views
10

Ocaml'deki haskell-like do notasyonu için camlp4 uzantısında çalışıyorum ve GHC'nin yinelemeli do-bindings'i (-XDoRec ile etkinleştirilmiş) nasıl derlediğini anlamaya çalışıyorum.
Monadic fixpoint birleştiricisinin sıkı bir dilde (Ocaml/F #/SML/... gibi) bulunması mümkün mü acaba?
Evet ise nasıl görünebilir? Çok faydalı olur muydu? hesaplama oluşturucu diğer monadik (veya MonadPlus) işlemleri ek olarak Delay çalışmasını desteklemeye çünküSıkı bir dilde MonadFix

let rec ones = seq { 
    yield 1 
    yield! ones } 

Bu desteklenir:

cevap

14

(Haskell'e do ile ilgili) F # hesaplama ekspresyon dizimi yineleme destekler. Kod gibi bir şey için çevrilmiştir:

let rec ones = 
    seq.Combine 
    (seq.Yield(1), 
     seq.Delay(fun() -> seq.YieldFrom(ones))) 

Delay tipi genel olarak (unit -> M<'T>) -> M<'T> ve hile onu değerlendirilir gecikmiş bir hesaplama içine etkiler (ya da acil özyinelemeli referans) ile bir hesaplama sarar yani, olduğu talep ediyoruz. Eğer mekanizma F # nasıl çalıştığı hakkında daha fazla bilgi edinmek istiyorsanız

, ardından aşağıdaki iki kağıtları ilgilidir:

birincisi nasıl F # açıklar hesaplama ifadesi sözdizimi desugared (ve nasıl Delay eklenir - ve genel olarak, F # nasıl gecikmeli ve istekli hesaplamaları etkilerle birleştirir) ve ikincisi, F # nasıl davranırDeğerlerlebeyanları - yukarıdaki ones değeri gibi.

+0

Yani, hayır - tamamen katı bir şekilde mümkün değildir. Tüm işlevsel dillerin bazı tembellik kavramları olduğu için (çoğunlukla fonksiyonlar, kapanışlar ve değişkenler) - tembel yapılar aracılığıyla "katı diller" de mümkündür. –

+0

Çoğunlukla tembellik zaten orada ama eğer monadınız soyut bir tipin arkasındaysa, OCaml bunu istismar etmenize izin vermeyecektir - 'Bu tür bir ifadenin 'izin ver' seçeneğinin sağ tarafı olarak kullanılmasına izin verilmez. Bu gibi durumlarda sahte "birim" argümanlarına gitmelisiniz (ya da belki de "tembelliğe ihtiyacınız var"). – lukstafi