2

我正在努力创建一个 F# 函数。我是 F# 的新手(充其量),真的可以使用一些帮助。我已经为此倾注了一个星期,所以你能提供的任何帮助都是无价的!


功能目标:

  • 输入:aList和 astring
  • 将字符串修改为Proper Case
  • 将字符串与列表中的每个项目进行比较
  • 用列表项替换任何匹配项

例子:

  • String = "sc 中的美元"
  • 列表 = [“NIF”;“PF”;“PS”;“SC”;“我们”; “美国”; “美元”]

功能动作:

  1. 将字符串设置为正确大小写=“sc 中的美元”
  2. 将字符串与列表中的每个项目进行比较并酌情替换
    • “我们”变成“我们”
    • “sc”变成“SC”
  3. 最终结果是“SC 中的美元”

这就是我迄今为止所拥有的。

let myList = ["NIF"; "PF"; "PS"; "SC"; "US"; "USA"; "USD"]
let FixAccronyms aList fixString= 
    aList |> List.iter 
        (fun listItem ->
        match listItem with            
        | fixString -> printfn  "%s, %s" listItem fixString
        | _ ->  printf  "%s" "" |> ignore)

在 FSI 中:

FixAccronyms myList "the us dollar in sc";;

该函数遍历列表,但它打印列表中的每个项目,而不仅仅是它与 fixString 匹配的位置。假设这有效,我既不确定如何对字符串的一部分进行模式匹配,也不确定如何在字符串中进行查找和替换......


FSI 的结果

val myList2 : string list = ["NIF"; "PF"; "PS"; "SC"; "US"; "USA"; "USD"]
val FixAccronyms2 : aList:string list -> fixString:'a -> unit

>FixAccronyms2 myList2 "the us dollar in sc";;
NIF, NIF
PF, PF
PS, PS
SC, SC
US, US
USA, USA
USD, USD
val it : unit = ()

先感谢您!

4

2 回答 2

1

这是一种方法:

open System
open System.Collections.Generic

let properCase lookup (str: string) =
  let lookupDict = Dictionary(StringComparer.CurrentCultureIgnoreCase)
  for word in lookup do lookupDict.Add(word, word)
  (str, str.Split()) ||> Array.fold (fun pcWord word -> 
    match lookupDict.TryGetValue(word) with
    | true, s -> pcWord.Replace(word, s)
    | _ -> pcWord)

> properCase ["NIF"; "PF"; "PS"; "SC"; "US"; "USA"; "USD"] "The us dollar in sc"
val it : string = "The US dollar in SC"
于 2013-03-18T22:00:55.767 回答
1

这是另一种方法:

open System
open System.Text.RegularExpressions

let properCase lookup str =
    Regex.Replace(str, String.Join("|", Seq.map Regex.Escape lookup),
        (fun (x : Match) -> x.Value.ToUpper()),
        RegexOptions.IgnoreCase)

用法与@Daniel 的答案相同。

于 2013-03-19T13:37:10.373 回答