2012-04-18 18 views

Odpowiedz

12

Według the F# specification, ekspresja sekwencji może być normalne wyrażenie obliczeniowe (jest to przypadek, w którym piszesz do yield) lub może to być krótki formularz, który jest specyficzny dla sekwencji wyrażeń:

seq { comp-expr } 
seq { short-comp-expr } 

Obudowa comp-expr obejmuje Twoje pierwsze i ostatnie działające przykłady. Krótka forma używa -> i specyfikacja wyraźnie mówi, że dozwolone tylko krótki formularz z in słów kluczowych:

short-comp-expr := 
    for pat in expr-or-range-expr -> expr  -- yield result 

Istnieje wiele innych krótkich form, które byłyby przydatne w praktyce, ale myślę, że celem jest zapewniają specjalną składnię tylko dla tego, bardzo często, przypadku i w inny sposób utrzymują język w jednakowej formie.

+2

Link do specyfikacji już nie działa, każdy może spojrzeć na [najnowszą specyfikację] (http://fsharp.org/specs/language-spec/), sekcja "6.3.11 Wyrażenie sekwencji". –

4

Aby dodać więcej szczegółów do @ odpowiedź Tomasza, pierwszym i trzecim przykładem są opracowane jako:

let x = Seq.collect (fun i -> {yield i}) {1..10} 

natomiast swoją Drugim przykładem są tłumaczone na:

let x = Seq.map (fun i -> i) {1..10} 

zasady tłumaczeniowe są wymienione w Section 6.3.11 in the spec. W tej sekcji możesz również zobaczyć, że F # traktuje wszystkie pętle w postaci for (for...in...do i for...to...do) równomiernie, ale specjalna składnia z -> jest stosowana tylko do bloku for...in....

Nie ma problemu, ponieważ zawsze można użyć for...in... do wyrażenia for...to....