2013-08-31 7 views
6

Mam problem z deklaracją malejącej sekwencji int64.Dlaczego kompilator F # robi się skręcony z seq {0L ..- 5L ..- 10L}?

Co chcę to:

seq{0L..-5L..-10L};; 

Jednakże pojawia się błąd:

seq{0L..-5L..-10L};; 
    ---^^^^^^^^^^^^^^^ 

stdin(5,4): error FS0739: Invalid object, sequence or record expression 

Co ciekawe, to działa ze zwykłym int:

> seq{0..-5..-10};; 
val it : seq<int> = seq [0; -5; -10] 

Jeszcze bardziej interesujące, jeśli wstawię spacje między .., zacznie działać z int64 też:

> seq{0L .. -5L .. -10L};; 
val it : seq<int64> = seq [0L; -5L; -10L] 

Może ktoś wyjaśnić, dlaczego kompilator dostaje się do skrętu z seq{0L..-5L..-10L}?

Odpowiedz

6

Zgadzam się, że jest to nieco dziwne zachowanie. Ogólnie zaleca się (chociaż nie jest to ściśle wymagane w specyfikacji) pisanie spacji wokół .. i działa to w tym przypadku poprawnie. Więc polecam przy użyciu:

seq { 0 .. -5 .. -10 } 
seq { 0L .. -5L .. -10L } 

Dlaczego ten zachowuje się inaczej dla int i int64 jest? Możesz zauważyć, że podczas pisania 1..-2 i 1L..-2, Visual Studio inaczej koloruje tekst (w pierwszym przypadku .. ma taki sam kolor jak liczby, w drugim przypadku ma ten sam kolor, co .. ze spacjami).

Problem polega na tym, że gdy kompilator widzi 1., może to oznaczać wartość zmiennoprzecinkową (1.0) lub może to być początek 1.., więc ta sprawa jest traktowane specjalnie. Dla 1L. to nie jest problem - 1L. musi być początkiem 1L...

Tak więc, jeśli napiszesz 1..-5..-10, kompilator użyje specjalnej obsługi i wygeneruje sekwencję. Jeśli napiszesz 1L..-5..-10, kompilator analizuje ..- jako jednoargumentowy operator, który jest stosowany do 5L. Zapisanie spacji rozstrzyga niejednoznaczność między operatorem jednoargumentowym a .., po którym następuje liczba ujemna.

Dla porównania, tutaj znajduje się zrzut ekranu z mojego Visual Studio (co pokazuje 10.. na zielono, ale .. w drugiej linii w kolorze żółtym - nie jest szczególnie zauważalnej różnicy, ale są one różne :-))

enter image description here

+1

W moim Visual Studio (2012) nie dostaję żadnych różnic w kolorze z domyślnym schematem. Czy używasz jakiegoś specjalnego schematu? –

+0

@KomradeP. To całkiem możliwe - zmieniłem kolory liczb. Dodałem zrzut ekranu (ale może być konieczne powiększenie, kolory są podobne). –

Powiązane problemy