2017-01-09 7 views
2

次のコードでは、値のリストを示すmaxLenが見つかりました。 maxLenは変更可能な値です。どのように機能的な練習のためにそれを削除するには?コード内のグローバル可変変数を削除するにはどうすればよいですか?

let reject pos = // reject a given pos, the implementation is contrived 
    let s = [4; 9; 14] // Just an example, any value may be rejected 
    s |> List.exists (fun x -> x = pos) 

let getLength pos = if pos % 3 = 0 then pos * 2 else pos 

let mutable maxLen = 0 

let getNewPosAndSetMaxLength pos len = // For each new position, check if the result of `getLenth pos` is larger than previous ones. 
    let direction = if len < 1 then -1 else 1 
    let newPos = 
     match [1..abs(len)] |> List.tryFind (fun i -> reject (pos + i * direction)) with 
     | Some p -> p 
     | None -> pos + len 
    let newLen = getLength newPos 
    maxLen <- if newLen > maxLen then newLen else maxLen 
    newPos 

[<EntryPoint>] 
let main argv = 
    let pos = 0 
    [3; -2; 6; 7] 
    |> List.iter (fun x -> 
     let pos = getNewPosAndSetMaxLength pos x 
     () 
    ) 
    printfn "%d" maxLen 
    0 // return an integer exit code 
+0

あなたの代わりに ''リストの '' List.fold''を使用してみました.iter''と変更可能な? – Gustavo

+0

ありがとう、私は 'getNewPosAndSetMaxLength'関数を変更してnewPosとlengthの両方を返す必要があると思います。 – ca9163d9

答えて

2

あなたは現在の最大長を取り、あなたがList.foldを使用することができます(pos, maxLength)のペアを返すようにgetNewPostAndSetMaxLengthを変更する場合:

let getNewPosAndSetMaxLength maxLen pos len = // For each new position, check if the result of `getLenth pos` is larger than previous ones. 
    let direction = if len < 1 then -1 else 1 
    let newPos = 
     match [1..abs(len)] |> List.tryFind (fun i -> reject (pos + i * direction)) with 
     | Some p -> p 
     | None -> pos + len 
    let newLen = getLength newPos 
    let maxLen' = if newLen > maxLen then newLen else maxLen 
    (newPos, maxLen') 

[<EntryPoint>] 
let main argv = 
    let (lastPos, maxLen) = [3; -2; 6; 7] |> List.fold (fun (pos, maxLen) x -> 
     getNewPosAndSetMaxLength maxLen pos x) (0, 0) 
    printfn "%d" maxLen 
    0 // return an integer exit code 
関連する問題