Comment diviser une chaîne en une liste de caractères dans F Sharp, par exemple, si je souhaite diviser le mot "Hello" en une liste de caractères, par exemple.
"Hello" ->['H';'e';'l';'l';'o']
J'ai essayé Split ([| |]) mais il ne divise qu'une chaîne en fonction du paramètre u passé.
J'ai essayé cela mais cela n'a toujours pas fonctionné
let splitChar (text:string) =
[for c in text ->c]
let splitChar (text:string) =
[for c in text do yield c]
Vous pouvez utiliser Seq.toList
pour convertir une chaîne en une liste de caractères:
Seq.toList "Hello"
Une chaîne de caractères est essentiellement une séquence de caractères, car elle implémenteIEnumerable<char>
. En interne, une chaîne est un tableau de valeurs char. Ce tableau est exposé par le biais de Chars indexer.
Vous pouvez utiliser n'importe quelle méthode Seq
sur une chaîne, par exemple:
"abc" |> Seq.iter (fun x->printfn "%c" x)
Les personnages individuels sont également disponibles
Vous pouvez également utiliser les fonctions optimisées du module String :
"abc" |> String.iter (fun x->printfn "%c" x)
Le module String
utilise les méthodes de la classe String
pour améliorer les performances. Par exemple, la fonction String.length est un alias pour la propriété String.Length
. Il n'est donc pas nécessaire de parcourir tous les caractères comme Seq
ferait:
let length (str:string) =
let str = emptyIfNull str
str.Length
D'autres fonctions, comme String.iter utilisent directement l'indexeur Chars
:
let iter (f : (char -> unit)) (str:string) =
let str = emptyIfNull str
for i = 0 to str.Length - 1 do
f str.[i]
En .NET, vous pouvez utiliser String.ToCharArray method. Pour revenir dans une chaîne, vous pouvez utiliser String (Char []) maintenant que F # utilise des constructeurs comme fonctions.
"Hello".ToCharArray() |> List.ofArray
Il peut être préférable d’utiliser simplement le module F # Array. Je suppose que List.ofArray
est plus efficace que List.ofSeq
. Si cela n'a pas d'importance, comme dans la réponse de Chad, la méthode idiomatique en F # est la suivante:
"Hello" |> List.ofSeq
J'ai remarqué des occasions où je pensais initialement diviser quelque chose en un tableau de caractères ou une liste - mais où je devrais être plus concis.
let msg = "hello-world"
let resultA =
msg.[0..0].ToUpper() + msg.[1..].Replace('-', ' ')
let resultB =
Seq.toList (msg)
|> (fun list -> (string list.Head).ToUpper() + (String.Concat(list.Tail)).Replace('-', ' '))
// val resultA : string = "Hello world"
// val resultB : string = "Hello world"
Le résultat est meilleur, je pense.