Zauważyłem, że następujący kod kompiluje i działa w VS 2013:Dlaczego "do" jest dozwolone w funkcji?
let f() =
do Console.WriteLine(41)
42
Ale patrząc na specyfikację F # 3.0 nie mogę znaleźć żadnej wzmianki do
wykorzystywane w ten sposób. O ile mogę powiedzieć, do
mogą mieć następujących zastosowań:
- W ramach pętli (np
while expr do expr done
), to nie w tym przypadku. Wewnątrz wyrażeń obliczeniowych, np .:
seq { for i in 1..2 do do Console.WriteLine(i) yield i * 2 }
To nie o to chodzi tutaj zarówno,
f
nie zawiera żadnych wyrażeń obliczeniowych.Mimo wszystko co mnie tu mylą to, że zgodnie ze specyfikacją,
do
powinno następować poin
. Tenin
powinien być opcjonalny ze względu na lekką składnię, ale dodanie go tutaj powoduje błąd kompilacji ("nieoczekiwany token" w wyrażeniu "lub niekompletny").Oświadczenie w module lub klasie. Tak też nie jest w tym przypadku,
do
znajduje się wewnątrz funkcji, a nie wewnątrz modułu lub klasy.
Zauważyłem również, że z #light "off"
, kod nie kompiluje („Nieoczekiwane słowa kluczowego«do»wiązania”), ale nie znaleźliśmy niczego, co mogłoby wyjaśnić to w sekcji lekkiej składni albo .
Bazując na tym wszystkim, zakładam, że używanie funkcji do
wewnątrz funkcji w ten sposób nie powinno się kompilować, ale działa. Czy tęskniłem za czymś w specyfikacji? Czy jest to rzeczywiście błąd w kompilatorze lub w specyfikacji?
To się nazywa wiązanie 'do'. Nie mogłem go znaleźć w specyfikacji, ale jest to [udokumentowane w MSDN] (http://msdn.microsoft.com/en-us/library/dd393786.aspx). – Daniel
@Daniel Trzeci przypadek, o którym wspomniałem, "wykonaj" wewnątrz modułu. "Użyj a do wiązania, jeśli chcesz wykonać kod * niezależnie od funkcji *" – svick
Aby zakończyć cytat: _ niezależnie od funkcji * lub definicji wartości * ._ Drugi przypadek może mieć zastosowanie w funkcji. – Daniel