2013-03-04 12 views
7

Może to zbyt proste, ale nie mogę znaleźć żadnej odpowiedzi w Internecie
Próbuję zwiększyć wartość w F # (jak count++ w C#).
Nie chcę używać opcji "zmienne", Po prostu chcę zobaczyć przykład, który powinien wyglądać funkcja Inkrementacja w F #.
I jak z tego korzystać.Przyrost wartości w F #

+0

Czy to znaczy 'let fx = x + 1 ' – mbeckish

+0

ale nie mogę używać: count = f count – cheziHoyzer

+1

http://jprajavel.blogspot.nl/2011/11/i-kind-of-functionality-in-f.html Pierwsze trafienie w google dla 'i ++ w F #' –

Odpowiedz

19

Idea "zwiększania wartości" w takim samym sensie, jak w C++ ma sens jedynie w przypadku pracy z zmiennymi wartościami lub w przypadku korzystania z mutowalnej komórki odniesienia (zasadniczo prostego obiektu przechowującego wartości zmienne). Jeśli masz zmienny komórkę odniesienia, można użyć incr funkcję:

let count = ref 0 
incr count 

jeśli użyć zmiennej zmienny, to nie ma wbudowaną funkcję do tego i trzeba napisać count + 1:

let mutable count = 0 
count <- count + 1 

Jeśli piszesz kod przy użyciu niezmiennych wartości, to zazwyczaj wystarczy napisać count + 1, a następnie przekazać wynik do jakiejś funkcji (lub gdzie indziej - zależy to od konkretnego przypadku). Na przykład, aby obliczyć długość listy F #, należy napisać:

let rec length list = 
    match list with 
    | [] -> 0 
    | _::tail -> 1 + (length tail) 

W tym przykładzie wyrażenie 1 + (...) jest kod odpowiadający i++ w kod C++, który wykonuje iteracje nad listą i oblicza jego długość. Wynik wyrażenia nie jest przypisany do nowej zmiennej, ponieważ jest zwracany bezpośrednio w wyniku działania funkcji length.

EDYCJA Parametry funkcji są niezmienne, co oznacza, że ​​nie można zmienić ich wartości. Jak wspomniał Lee, możesz użyć zmiennej shadowing, aby ukryć starą wartość z nową - ale pamiętaj, że ma ona tylko efekt lokalny (to jest jak definiowanie nowej zmiennej o innej nazwie do zapisania nowej wartości). Na przykład:

let rec length list count = 
    match list with 
    | [] -> count 
    | _::tail -> 
    let count = count + 1 // Variable shadowing used here 
    length tail count 

Nie można napisać funkcję do uproszczenia linię let count = count + 1 i jak wspomniano powyżej, jest to równoznaczne z pisania let newCount = count + 1 a następnie za pomocą newCount na ostatniej linii.

+0

OK, dziękuję, ale ja chcesz napisać funkcję, która bierze "licznik" jako parametr, a następnie (w treści funkcji) zwiększa to jak mogę to zrobić? – cheziHoyzer

+1

@cheziHoyzer Zobacz edycję - ale pamiętaj, że podejście funkcjonalne polega na użyciu niezmiennych wartości, więc nie możesz "zwiększyć" zmiennej lokalnej (czy jest to parametr zmienny lub funkcja), chyba że jest zmienna. –

3

Jeśli nie chcesz korzystać z opcji mutable, nie możesz wykonać niszczącej aktualizacji, takiej jak ++ w języku C#. Możesz śledzić zmienną za pomocą nowej o tej samej nazwie, np.

let x = 4; 
let x = x + 1 in (x+4) //returns 8 

Chociaż nie można zapisać tego jako funkcji.

EDIT: Jeśli chcesz używać zmiennych Zmienna następnie można utworzyć funkcję, która modyfikuje ref:

let increment (ir: int ref) = ir := !ir + 1 

Można następnie użyć go jako

let i = ref 1 
increment i 
let iv = !i //iv contains 2 

Jak Tomas wskazuje w swojej odpowiedź, ta funkcja już istnieje i nazywa się incr.

+0

OK, dziękuję, ale chcę napisać funkcję, która przyjmuje "count" jako parametr, a następnie (w treści funkcji) ją zwiększa (jeśli używam zmiennego), jak mam to zrobić (kto powinien wyglądać deklaracja funkcji? ?) – cheziHoyzer

3

Nie można symulować operatora postincrement ale można zrobić preincrement

let inline (+=) (x : byref<_>) y = x <- x + y 

let mutable a = 0 
&a += 1 

lub

let inline incv (x : byref<_>) = x <- x + LanguagePrimitives.GenericOne; x 

let mutable b = 0 
incv &b