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"
但我会说这是糟糕的代码。
我需要在 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"
但我会说这是糟糕的代码。