问题描述
我需要在 F# 中完成一个方法。我整天都在寻找一些方法来改变字符串中的一个字母,但没有找到任何东西。我已经完成了 (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)
解决方法
正如评论中提到的,.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)