首页 > 解决方案 > F# 可变列表返回一个错误,指出它不可变

问题描述

我正在尝试在 F# 中实现一个队列。我想到的一种方法是使用可变列表。我相信逻辑没问题,但是当我运行代码时出现错误

/home/runner/main.fs(12,5): error FS0027: This value is not mutable. Consider using the mutable keyword, e.g. 'let mutable queue = expression'.
compiler exit status 1
^[[3;1R

这是我的实现代码

let create_job_list jobCount resultLis =
    let resultLis =
        [for i in 1..jobCount do yield System.Random().Next(10)]
    resultLis

let job_list = create_job_list 10 []

let mutable queue = []

let push x queue =
    printfn "%A" x
    queue <- (x::queue)

let pop resQueue =
    let resQ = resQueue |> List.rev
    match resQ with
    | head::tail -> printfn "%A" head; queue <- (tail |> List.rev)
    | [] -> failwith "No more jobs to do right now." 

let rec jobQueue job_list =
    match job_list with
    | head::tail when head%2=1 -> (push head queue) |> ignore; jobQueue tail
    | head::tail when head%2=0 -> (pop queue) |> ignore; jobQueue tail
    | _ -> failwith "Empty list"

错误告诉我使用let mutable queue = expression,但我正在使用let mutable queue = []

我哪里错了?谢谢

标签: debuggingf#queuemutable

解决方案


您已将 queue 声明为可变的,但您将它作为不再可变的参数传递。由于您的queue变量在 push 和 pop 中可见,因此您不需要将其作为参数。

这应该编译:

  let create_job_list jobCount resultLis =
    let resultLis =
        [for i in 1..jobCount do yield System.Random().Next(10)]
    resultLis

  let job_list = create_job_list 10 []

  let mutable queue = []

  let push x=
      printfn "%A" x
      queue <- (x::queue)

  let pop resQueue =
      let resQ = resQueue |> List.rev
      match resQ with
      | head::tail -> printfn "%A" head; queue <- (tail |> List.rev)
      | [] -> failwith "No more jobs to do right now." 

  let rec jobQueue job_list =
      match job_list with
      | head::tail when head%2=1 -> (push head) |> ignore; jobQueue tail
      | head::tail when head%2=0 -> (pop) |> ignore; jobQueue tail
      | _ -> failwith "Empty list"

推荐阅读