2017-05-02 54 views
0

如何在FP方式的字符串中的指定位置获取字符(即没有肮脏的.[index]黑客)?在字符串中的指定位置获取字符

如果我使用Seq.item它将迭代所有索引,直到n元素,所以使该函数每次运行非常慢。

在下面的示例中,如果sourcestring,那么将访问O(1),否则将访问O(n)

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]'“肮脏的黑客”?这是获得O(1)访问权限的方式。 – Lee

+0

@Lee因为然后我需要添加明确的类型注释的功能,我暂时不能。 – MiP

回答

2

String模块FSharp.Core是不是真的很全功能的,但你可以创建自己的,并包括与类型推断很好地起到一些可重复使用的功能,那么你只需要编写一次显式类型注解,你可以利用别处的类型推理。

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

我建议分别命名这些'tryItem'和'item',以便与'Seq','List'和'Array'模块中的等价函数保持一致。 – Tarmil