F# - 保存以前打印的文字

时间:2017-03-15 14:54:18

标签: f# functional-programming

所以我有一个包含字符的文本文件,我让用户通过在控制台中打印来读取(通过将文件内容读入字符列表并将其转换为字符串),之后我试图让用户更改char列表中的一个字母。但是这样做我将不得不做一个循环并访问包含char列表的变量并循环遍历它,然后将其保存在同一个变量(或新变量)中以显示用户批准,如果不是用户应该能够通过运行相同的循环再次更改角色。

虽然我的问题是我找不到改变包含字符列表的变量而不使变量变为可变的方法。这个问题有什么建议吗?

            while true do            
                Console.Write("\n\nDo you want to change some tokens? press 1 or 2 to end: ")
                let rep = Console.ReadLine() |> int
                if rep = 1 then
                    Console.Write("\n\n Enter the token you will change in the text : ")
                    let user = Console.ReadLine() |> char
                    let k1 = user
                    Console.Write("\n Enter your token you will replace TO : ")
                    let user2 = Console.ReadLine() |> char
                    let k2 = user2
                    let t = finalList
                    let finalList2 = swap t k1 k2
                    let f2 = finalList2 |> charListToString

                    printfn "%s" f2

正如我上面的代码实现中所见,我只能更改一次列表,如果循环再次运行,它将丢失之前更改的第一个值。

1 个答案:

答案 0 :(得分:3)

没有声称这是最佳解决方案,但根据您的问题,我认为这是您要实现的目标;一个简单的查找和替换字符串中的字符?

这是一个解决方案,它使用递归函数和用户按下的键的内部模式匹配。它应该让你开始,把它放到.fsx文件中并在fsx文件的命令行上调用fsc,然后你可以调用生成的exe并查看它的作用。

open System

let rec change ( data : string ) =
  printfn "\n1 to make changes or 2 to quit"
  let keyPressed = Console.ReadKey() 
  match keyPressed.KeyChar with
  | '1' -> 
    printfn "\nEnter the character in the string you want to change:"
    let changeChar = Console.ReadKey().KeyChar
    printfn "\nEnter the character to change to:"
    let changeTo = Console.ReadKey().KeyChar
    let newData = data.ToCharArray() |> Array.map ( fun c -> if c = changeChar then changeTo else c ) |> String
    printfn "\n%s\n" newData
    change newData
  | '2' -> data
  | _ -> change data

[<EntryPoint>]
let Main args =
  printfn "\n%s\n" <| change "abc"

  0