2011-09-23 18 views
9

bazı OCaml kodlarında"let() =", Ocaml'da ne anlama geliyor?

let() = print_string "something" in 
fn 

gibi kodlar vardır.

Bu ne anlama geliyor? "()" Konusunda özel bir anlam var mı? yoksa bu let ifadede yaklaşık () özel bir şey yok

print_string "something"; 
fn 
+0

Muhtemelen 'let _ = ...' mümkünse, ancak tüm ifadeler olmasa bile çoğunda çalışacağı için kullanmak isteyeceksiniz. –

+1

'let _ = ...' veya kırılgan desen eşleşmesi kesinlikle önerilmez. Tip sistemine bir orta parmak vermek neredeyse eşdeğerdir. – nlucaroni

+0

Nlucaroni'ye katılıyorum. eğer istersen izin ver = ... ... ..., o zaman muhtemelen görmezden geleceksin (...); ... ' – newacct

cevap

11

aynı anlamı mı, sadece bir şablon. Tüm let ifadeler letpattern=expressioninother-expression benziyor. Burada desen her zaman eşleşecektir, çünkü print_stringunit döndürür ve () bu türün tek değeridir. Bu şekilde, ilk ifadenin daha çok bir ifadeyle (unit döndürür) iki ifadeyi bir araya getirmenin bir başka yolu.

Yani haklısınız, yapının ; işlecini kullanmasıyla hemen hemen aynı anlamı vardır. Tek gerçek fark önceliklidir. Örneğin, sen

if x < 3 then 
    print_string "something"; 
    f x 

yazarsanız size f x denilen hep olduğunu bulur. ;'un önceliği, ikinci ifadeyi if denetiminin altına çekmek için çok düşük. Bu nedenle birçok insan (benim dahil) let() =expression'u kullanma alışkanlığına giriyor. Eğer

if x < 3 then 
    let() = print_string "something" 
    in f x 

x ne istiyorum genellikle olduğu 3'ten az olması durumunda sadece denir f x yukarıdaki yazarsanız. Özünde, let'un önceliği ;'dan çok daha yüksektir.

Elbette bu efekti elde etmenin başka yolları da olabilir, ancak let kullanımıyla ilgili güzel olan şey, kodda daha sonra (kapama parantezi veya end gibi) herhangi bir şey eklemek zorunda kalmamanızdır. print_string hata ayıklama ifadesi olarak ekliyorsanız, bu değişiklikleri yerel olarak tek noktada tutmanın kullanışlı bir yoludur.

+0

Sözdizimi tarafından izin verilen şaşırtıcı programın bir başka örneği olarak, sadece f() işlevini çalıştırmak istediğinizde, her zamanki aritmetik yasaları basılı tutulduğunda,' yazalım 4 = 2 + 2 f(); –

3

Jeffrey cevabı kesinlikle doğru olduğunu, ancak bir nokta daha: Eğer

fx "something"; 
fn 

yazmak Ve derleyici bir Uyarı yayacaktır fx "something" sonucu türünü berbat eğer

, o sırasında Kaybolabilirsin derleme. Öte yandan yazarsanız:

let() = fx "something" in 
fn 

derleyici gerçekten tip unit ait olduğunu yani fx "something" sonucu () karşı eşleştirilebilir kontrol yazacaktır. Böylelikle hata yaptıysanız, genellikle daha güvenli olan bir hata oluşur.

da sadece Jeffrey söz öncelik efekti elde fakat _ her türlü değerlerine karşı eşleştirilebilir beri, herhangi bir tür denetlemesi yapmayacağım

let _ = fx "something" in 
fn 

yazmak için olasılığı vardır.

+0

ve sonuncusu, “yok say” (fx "bir şey") ile eşdeğerdir; noktalı virgül notasyonunda – newacct