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。