2012-03-19 15 views
8

F # List zapewnia operatorowi cons (::) dodanie elementu z przodu listy. Czy istnieje funkcja, aby zrobić to samo dla Seq? Jedynym sposobem, w jaki natknąłem się, jest użycie Seq.append w następujący sposób. Czy istnieje bardziej wydajny/elegancki sposób robienia tego?Lepszy sposób dodawania elementu na początku sekwencji F #

> let myLst = [1..5] 
> 0::myLst;; 
val it : int list = [0; 1; 2; 3; 4; 5] 


> let mySeq = {1..5} 
> Seq.append (seq [0]) mySeq;; 
val it : seq<int> = seq [0; 1; 2; 3; ...] 

Możliwy duplikat, ale nie odpowiada na moje pytanie.

[1] wykorzystuje Seq.append jak wyżej

+3

Zauważ, że możesz po prostu użyć 'Seq.append [0] mySeq', nie musisz owijać' [0] 'w wywołaniu' seq'. – kvb

Odpowiedz

8

To może pomóc przypomnieć, że F # sekwencja jest kalkulacja, rzeczywiście. Bez względu na to, jak zamierzasz to osiągnąć, na koniec dnia powinieneś mieć nowe obliczenia, które, jeśli są wyliczane, najpierw dają dołączony element, a następnie dają starą sekwencję. W większości ksztalt można to osiągnąć stosując a sequence expression:

> let mySeq = {1..5} 
> seq { yield 0; yield! mySeq };; 
val it : seq<int> = seq [0; 1; 2; 3; ...] 

Seq.append funkcji biblioteki jest tylko zoptymalizowany realizacji semantycznie tego samego działania.

+0

Gene Belitski: dzięki. więc czy sugerujesz używać 'Seq.append', ponieważ jest zoptymalizowany? – vis

+0

@vis: Nie uważam, że uniwersalne zalecenie "jeden dla wszystkich" ma sens. Odpowiedź jak zwykle brzmi "to zależy ...". Niemniej jednak, gdy znasz podstawowe zasady, możesz sam dokonać wyboru. –

Powiązane problemy