F# 更改字符串中的字母

F# change a letter in a string

我需要在 F# 中完成一个方法。 All-day 我正在寻找一些方法来更改字符串中的字母,但没有找到任何东西。我已经完成了 (a),现在我需要在 (b) 中使用 (a) 中的方法。

let rec vowelToUpper x : char = 
    match x with 
    | 'a' -> 'A'
    | 'e' -> 'E'
    | 'i' -> 'I'
    | 'o' -> 'O'
    | 'u' -> 'U'
    | _ -> x
let rec converter (str ) length =  
    if length=0 then 
        str
    else
        str.[length-1] <- vowelToUpper str.[length-1]
        converter str (length-1)
  

<- 和 = 都不起作用,在这种情况下,错误提示要考虑使用一些约束。我想我需要在 str 上使用字符列表约束。另外,也许是因为它不可变?既然这是任何编程语言都要做的基本事情,为什么在互联网上很难找到解决方案?)

如评论中所述,.NET 中的字符串是不可变的,无法更改。 converter 函数可以工作的唯一方法是返回一个 new 字符串。

有几种方法可以做到这一点。与作业的答案一样,我不会给你一个完整的解决方案,但你应该能够将一些提示放在一起。

首先,最明显的方法是使用 String.map 函数,该函数接受一个函数 char -> char(您已经有一个了!)和一个输入字符串并生成一个新的输出字符串.

其次,如果您想对字符串进行自己的函数式处理,那么最好的方法是将字符串转换为字符列表,然后再返回。然后,您可以使用模式匹配和递归将字符串转换为字符列表:

let sin = "hello"
let l1 = sin |> List.ofSeq
let l2 = (* ... do some transformation here ... *)
let sout = System.String(Array.ofSeq l2)

最后,如果你真的想使用基于改变数组的东西,你可以获取字符数组,改变它然后构造一个新字符串:

let sin = "hello"
let arr = sin.ToCharArray()
arr.[0] <- 'H' (* Mutate the array *)
let sout = System.String(arr)

这对我来说很有效,生成了一个新字符串。


let rec converter (str : string) (finalStr : string) length =  
    if length=0 then 
        finalStr
    else
        converter str (finalStr + (vowelToUpper str.[length-1]).ToString()) (length-1)
    

let to_upper =
    function
    | 'a' -> 'A'
    | 'e' -> 'E'
    | 'i' -> 'I'
    | 'o' -> 'O'
    | 'u' -> 'U'
    | x -> x

"hello world"
|> Seq.map to_upper
|> Seq.toArray
|> System.String

所以我没有读取条件:(

这将按规定工作

let vowelToUpper c = 
    match c with
    | 'a' -> 'A'
    | 'e' -> 'E'
    | 'i' -> 'I'
    | 'o' -> 'O'
    | 'u' -> 'U'
    | _ -> c
    |> (string)

let rec convert input =
    match Seq.tryHead input with
    | None -> ""
    | Some c -> (vowelToUpper c) + (convert (Seq.tail input))

convert "hello world"

但我会说这是糟糕的代码。