2016-02-04 102 views
4

我正在玩一點F#語法。F#:替換爲.Replace(「oldValue」,「newValue」)

在瑞典,我們有一個名爲「Backslang」 遊戲 (從「Rövarspråk」 googletranslated)的規則很簡單。你所說的所有單詞都必須以特定的方式說出。雖然聲音是相同的,但每個輔音必須用「o」發音,然後再輔音。

I.e. 「L」「LOL」「FRIDAY」將是 「FOFRORIDODAY」「BALL」「BOBALOLLOL」

我寫了一些代碼,看起來很愚蠢,但它的工作。

let myWord (x:string) = 
    x.Replace("q","qoq").Replace("w","wow").Replace("r","ror").Replace("t","tot").Replace("p","pop").Replace("s","sos").Replace("d","dod").Replace("f","fof").Replace("g","gog").Replace("h","hoh").Replace("j","joj").Replace("k","kok").Replace("l","lol").Replace("z","zoz").Replace("x","xox").Replace("c","coc").Replace("v","vov").Replace("b","bob").Replace("n","non").Replace("m","mom").Replace("Q","QOQ").Replace("W","WOW").Replace("R","ROR").Replace("T","TOT").Replace("P","POP").Replace("S","SOS").Replace("D","DOD").Replace("F","FOF").Replace("G","GOG").Replace("H","HOH").Replace("J","JOJ").Replace("K","KOK").Replace("L","LOL").Replace("Z","ZOZ").Replace("X","XOX").Replace("C","COC").Replace("V","VOV").Replace("B","Bob").Replace("N","Non").Replace("M","Mom").ToLower() 

    myWord "ball" 

F#互動: VAL它:字符串= 「bobalollol」

對於可讀性的原因,有什麼辦法給這個代碼更好看?

我是F#和函數式編程的新手,所以任何意見,protip和指針都熱烈歡迎!

回答

2
String.collect (string >> function 
    | vowel when "aeiouyåäöAEIOUYÅÄÖ".Contains vowel -> vowel 
    | consonant -> consonant + "o" + consonant) 

String.collect應用一個函數的字符串的字符每一個。

+2

如果你將它與FuleSnabel的'isVowel'函數結合起來,它將是兩全其美的,IMO:'String.collect(當isVowel c - > string c | c - > sprintf「%co%c」cc時的函數c) ' – Daniel

+0

這個解決方案非常整潔!我很喜歡。還修正了資本輔音再次出現的一個小問題。 _ **即** _ 其中** Ball **輸出** BoBalollol **現在讀取** Bobalollol。** '| |輔音 - >輔音+「o」+ consonant.ToLower())' – Awots

7

也許是這樣的:

let isVowel = function 
    | 'a' | 'e' | 'i' | 'o' | 'u' | 'y' | 'å' | 'ä' | 'ö' 
    | 'A' | 'E' | 'I' | 'O' | 'U' | 'Y' | 'Å' | 'Ä' | 'Ö' -> true 
    | _ -> false 

let lollify s = 
    [| for c in s do if isVowel c then yield c else yield c; yield 'o';yield c |] 
    |> System.String 

[<EntryPoint>] 
let main argv = 
    printfn "%A" <| lollify "Ball" 
    0 

注意;這也有利於不創建大量的臨時對象。

另一種辦法是這樣的:

let lollify s = 
    s 
    |> Seq.map (fun c -> if isVowel c then [|c|] else [|c;'o';c|]) 
    |> Seq.collect id 
    |> Seq.toArray 
    |> System.String 
+0

我發現第二個選項比第一個更具可讀性,即使它更長。 +1 –

+1

'isVocal'的實現演示了F#如何使人們能夠清晰地編寫代碼,並以可讀的方式傳達它的功能。代碼的大布局!我會稱它爲'isVowel',不過;) –

+0

謝謝!更新的代碼。 – FuleSnabel

相關問題