F# 更改字符串中的一个字母

问题描述

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

The task

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)
  

解决方法

正如评论中提到的,.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 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"

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

,

这对我来说是通过生成一个新字符串来解决的。


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