2017-05-02 9 views
0

文字列内の指定された位置にFPメソッドで文字を取得するにはどうすればよいですか(つまり、汚れていない.[index]ハック)?文字列内の指定された位置にcharを取得する

Seq.itemを使用すると、すべてのインデックスがn要素まで繰り返されるため、毎回機能が非常に遅くなるようにします。例怒鳴るで

sourcestringであれば、それはそれはO(n)アクセスよ他O(1)アクセスを、よ。

let getItem index source = 
    match box source with 
    | :? string as string -> printfn "String"; string.[index] 
    | _ -> printfn "Seq<char>"; Seq.item index source 
let stringChar3 = getItem 3 "ABCD" 
let seqChar3 = getItem 3 [ for c in ['A'..'D'] do yield c ] 

val getItem : index:int -> source:seq<char> -> char 
val stringChar3 : char = 'D' 
val seqChar3 : char = 'D' 
+7

どのように '。[index]' 'dirty hack 'を使用していますか?それがO(1)アクセスを取得する方法です。 – Lee

+0

@Leeそれで、関数に明示的な型の注釈を追加する必要があるので、私はその時点ではできません。 – MiP

答えて

2

FSharp.CoreStringモジュールは、実際には非常に完全な機能はありませんが、あなたが独自に作成し、型推論とうまく遊ぶいくつかの再利用可能な機能を含むことができ、その後、あなたは一度だけ明示的な型注釈を記述する必要があるとします他の場所で型推論を利用することができます。

module String = 
    let tryGetCharacter index (str : string) = 
     if index >= 0 && index < str.Length then 
      Some str.[index] 
     else 
      None 

    let getCharacter index (str : string) = 
     str.[index] 
+0

'Seq'、' List'と 'Array'モジュールの同等の関数との一貫性のために、それぞれ' tryItem'と 'item'という名前を付けることをお勧めします。 – Tarmil

関連する問題