在F#的这个例子中避免变异

sch*_*opy 2 f# functional-programming mutation

来自OO背景,我在试图避免变异时如何解决FP的简单问题时遇到了麻烦.

let mutable run = true
let player1List = ["he"; "ho"; "ha"]

let addValue lst value =
    value :: lst

while run do
    let input = Console.ReadLine()
    addValue player1List input |> printfn "%A"
    if player1List.Length > 5 then 
        run <- false
        printfn "all done" // daz never gunna happen
Run Code Online (Sandbox Code Playgroud)

我知道在某些情况下使用变异是可以的,但我正在努力训练自己以避免突变作为默认值.有了这个说,有人可以告诉我一个上面没有使用F#突变的例子吗?

最终的结果应该是player1List继续增长,直到项目的长度为6,然后退出并打印'all done'

Joh*_*mer 7

最简单的方法是使用递归

open System
let rec makelist l = 
    match l |> List.length with
    |6  -> printfn "all done"; l
    | _ -> makelist ((Console.ReadLine())::l)

makelist []
Run Code Online (Sandbox Code Playgroud)

我还删除了一些addValue函数,因为::在典型的F#代码中使用它更加惯用.

您的原始代码对于run = false您希望使用的新F#编码器也存在常见问题run <- false.在F#中,=总是用于比较.编译器确实警告过这个.