2

F#関数の作成に苦労しています。私は(せいぜい)F#の初心者であり、実際にいくつかの助けを借りることができます。私はこれを1週間注ぎ込んだので、あなたが提供できるどんな助けもかけがえのないものです!


機能目標:

  • 入力:aListおよびastring
  • 文字列を次のように修正しますProper Case
  • 文字列をリスト内の各項目と比較します
  • 一致したアイテムをリストアイテムに置き換えます

例:

  • 文字列="scでの米ドル"
  • リスト=["NIF"; "PF"; "PS"; "SC"; "私たち"; "アメリカ合衆国"; "米ドル"]

機能アクション:

  1. 文字列をProperCase="米ドルの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の場合:

FixAccronymsmyList"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

これを行うもう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 に答える
1

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 に答える