F# 如何删除代码中的全局可变变量?

F# 如何删除代码中的全局可变变量?,f#,F#,以下代码查找给出值列表的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

以下代码查找给出值列表的
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
let reject pos=//拒绝给定的pos,实现是人为的
让s=[4;9;14]//举个例子,任何值都可能被拒绝
s |>List.exists(乐趣x->x=pos)
让getLength pos=如果pos%3=0,则pos*2 else pos
设可变maxLen=0
让getNewPosAndSetMaxLength pos len=//对于每个新位置,检查“getLenth pos”的结果是否大于以前的结果。
让方向=如果len<1,则-1否则1
设newPos=
将[1..abs(len)]|>List.tryFind(乐趣i->拒绝(pos+i*方向))与
|一些p->p
|无->位置+透镜
设newLen=getLength newPos
maxLen maxLen然后是newLen else maxLen
纽波斯
[]
让主argv=
设pos=0
[3; -2; 6; 7] 
|>List.iter(乐趣x->
设pos=getNewPosAndSetMaxLength pos x
()
)
printfn“%d”maxLen
0//返回整数退出代码

如果将
getNewPostAndSetMaxLength
更改为获取当前最大长度并返回一对
(pos,maxLength)
则可以使用
列表。折叠

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
让getNewPosAndSetMaxLength MaxLeng pos len=//对于每个新位置,检查“getLenth pos”的结果是否大于以前的结果。
让方向=如果len<1,则-1否则1
设newPos=
将[1..abs(len)]|>List.tryFind(乐趣i->拒绝(pos+i*方向))与
|一些p->p
|无->位置+透镜
设newLen=getLength newPos
设maxLen'=如果newLen>maxLen,则newLen else maxLen
(newPos,maxLen')
[]
让主argv=
让(lastPos,maxLen)=[3;-2;6;7]|>List.fold(fun(pos,maxLen)x->
getNewPosAndSetMaxLength maxLen位置x)(0,0)
printfn“%d”maxLen
0//返回整数退出代码

您是否尝试过使用
List.fold
而不是
List.iter
和可变项?谢谢,我想我需要更改函数
getNewPosAndSetMaxLength
以返回newPos和length。