首先,你使用let
,如果它是變異變量的語句,但事實並非如此。在F#中,let
用於聲明一個新值(可以隱藏任何以前的同名數值)。如果你想使用突變編寫代碼,那麼你需要使用類似:
let c = a + b // declare new local value
l.Add(c)
a <- b // mutate value marked as 'mutable'
b <- c // .. mutate the second value
與您的代碼的第二個問題是,你試圖通過添加元素,它發生變異F#列表 - F#列表是不可改變,所以一旦你創建它們,你就不能修改它們(特別是,沒有Add
成員!)。如果你想寫使用突變這一點,你可以寫:
let fabList =
// Create a mutable list, so that we can add elements
// (this corresponds to standard .NET 'List<T>' type)
let l = new ResizeArray<_>([1;2])
let mutable a = 1
let mutable b = 2
while l.[l.Count - 1] < 400 do
let c = a + b
l.Add(c) // Add element to the mutable list
a <- b
b <- c
l |> List.ofSeq // Convert any collection type to standard F# list
但是,正如其他人已經指出,以這種方式編寫代碼是不地道的F#的解決方案。在F#中,您將使用不可變列表和遞歸來代替循環(例如while
)。例如像這樣:
// Recursive function that implements the looping
// (it takes previous two elements, a and b)
let rec fibsRec a b =
if a + b < 400 then
// The current element
let current = a + b
// Calculate all remaining elements recursively
// using 'b' as 'a' and 'current' as 'b' (in the next iteration)
let rest = fibsRec b current
// Return the remaining elements with 'current' appended to the
// front of the resulting list (this constructs new list,
// so there is no mutation here!)
current :: rest
else
[] // generated all elements - return empty list once we're done
// generate list with 1, 2 and all other larger fibonaccis
let fibs = 1::2::(fibsRec 1 2)
是的,你做錯了。你正在使用一種函數式編程語言,就像程序語言一樣。嘗試不首先使用while或任何類似的循環結構。 – 2010-05-16 22:41:06