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'
最简单的方法是使用递归
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#中,=总是用于比较.编译器确实警告过这个.