【问题标题】:F# change a letter in a stringF# 改变字符串中的一个字母
【发布时间】:2021-05-28 02:45:41
【问题描述】:

我需要在 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)
  

【问题讨论】:

  • 编译器不知道str 是否有索引器,因为它不知道str 的类型。告诉它类型是什么 - converter (str : string) length =
  • 但这对你没有帮助,因为字符串是不可变的。
  • 所以没有办法改字符串?
  • ``` let workingString = "aeioufffaa" let array = workingString.ToCharArray() 数组。[0]
  • 字符串在所有 .NET 语言中都是不可变的,因此与其考虑修改字符串,不如考虑生成包含正确答案的 new 字符串。

标签: arrays string recursion f# toupper


【解决方案1】:

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

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

首先,最明显的方法是使用String.map 函数,该函数将函数char -&gt; 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)

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:
      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"
      

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

      【讨论】:

        猜你喜欢
        • 2021-10-29
        • 1970-01-01
        • 2016-05-09
        • 2015-04-20
        • 1970-01-01
        • 1970-01-01
        • 2020-04-16
        • 2019-11-17
        • 2015-01-31
        相关资源
        最近更新 更多