pattern - spark string replace regex




F#, char seq-> 문자열 (3)

F #에는 문자열 전용Seq 모듈 기능이 포함 된 String 모듈 이 있습니다.

호언 장담일지도 모르는 빠른 질문 (그러나 나는 대신 계몽되기를 바란다).

F #에서 문자열은 "abcd"|> Seq.map f가 문자열에서 작동 할 수 있도록 Seq와 호환됩니다.

예를 들어 문자열에서 처음 5 개의 문자를 가져 오는 것과 같이 문자열로 작업하는 훌륭한 기능입니다.

"abcdef01234567" |> Seq.take 5

또는 중복 문자 제거 :

"abcdeeeeeee" |> Seq.distinct

문제는 char seq 결과를 얻은 후에 문자열을 다시 문자열로 변환하는 것이 매우 어색 스럽습니다. String.concat ""은 멤버가 문자열이어야하므로 많은 작업을 수행합니다.

"abcdef01234567" 
|> Seq.take 5
|> Seq.map string
|> String.concat ""

너무 많이 그래서 나는 내 프로젝트의 90 %에서 사용하는 기능을 가지고 :

let toString : char seq -> string = Seq.map string >> String.concat ""

이것이 정상에 있다고 생각하지만, StringBuilder 나 lambda를 인라 인하거나 새로운 것을 사용하는 등의 끔찍한 일들을 만났습니다.

"abcdef01234567" 
|> Seq.take 5
|> Seq.toArray 
|> fun cs -> new string (cs) (* note you cannot just |> string *)

내가 언어에서보고 싶어하는 (아마도 미친) 기대는 Seq이 문자열에 사용될 때 결과 표현식의 형식 시그니처는 string -> string이어야합니다. 의미, 나오는 것은 나오는 것입니다. "abcd"|> Seq.take 3 = "abc".

이 경우 높은 수준의 문자열 조작에 대한 내 기대가 잘못된 이유가 있습니까?

누구든지 좋은 방식으로이 접근에 대한 권고 사항을 가지고 있습니까, 나는 뭔가를 놓치고 있어야만하는 것처럼 느낍니다.


F #은이 질문이 5 년 전에 제기 되었기 때문에 생성자를 함수로 사용할 수있는 능력을 얻었습니다. 문자를 문자열로 변환하려면 String(Char[]) 을 사용합니다. 당신은 F # 시퀀스 또는 F # 목록에서 변환 할 수 있지만 아마 그냥 String.ToCharArray 메서드를 사용하여 F # 배열 모듈을 사용할 String.ToCharArray 있습니다.

printfn "%s" ("abcdef01234567".ToCharArray() |> Array.take 5 |> String)

char seq 를 사용하고 싶다면 문자열을 다음과 같이 파이프 처리 할 수 ​​있습니다.

printfn "%s" ("abcdef01234567" |> Seq.take 5 |> Array.ofSeq |> String)

Seq 모듈의 함수는 시퀀스 만 처리합니다. 즉, string 호출하면 Seq<char> 만 "보고"그에 따라 작동합니다. 인수가 string 인지 확인하기 위해 특수 검사 (예 : 문자열에 대한 함수의 최적화 된 버전)와 같은 특수 조치를 취한 경우에도 여전히이를 Seq<char> 로 반환해야만합니다. F # 형식 시스템 -이 경우 실제로 string 인지 확인하기 위해 어디에서나 반환 값을 확인해야 string .

좋은 소식은 F #에 작성중인 코드의 일부가 내장 된 바로 가기입니다. 예 :

"abcdef01234567" |> Seq.take 5

단축 될 수 있습니다 :

"abcdef01234567".[..4]  // Returns the first _5_ characters (indices 0-4).

다른 것들은 여전히 Seq 을 사용해야 Seq . 또는 문자열을 조작하기 위해 최적화 된 구현을 작성하십시오.

다음은 문자열에서 고유 한 문자를 가져 오는 함수입니다.

open System.Collections.Generic

let distinctChars str =
    let chars = HashSet ()
    let len = String.length str
    for i = 0 to len - 1 do
        chars.Add str.[i] |> ignore
    chars






seq