Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 避免迭代的最佳方法_F# - Fatal编程技术网

F# 避免迭代的最佳方法

F# 避免迭代的最佳方法,f#,F#,我有一根绳子 testString=“你好[1],我的名字是[2]” 我想替换它,使它等于 你好,玛丽亚,我的名字是我的。 我有一个接受字符串和替换列表的函数。然后根据需要迭代该列表 let parse testString (replacements: list<string>) = let mutable result = testString for index = 1 to replacements.Length do

我有一根绳子

testString=“你好[1],我的名字是[2]”

我想替换它,使它等于

你好,玛丽亚,我的名字是我的。

我有一个接受字符串和替换列表的函数。然后根据需要迭代该列表

let parse testString (replacements: list<string>) =
        let mutable result = testString

        for index = 1 to replacements.Length do
            result <- result.Replace("[" + (index).ToString() + "]", replacements.[index-1])

        result

parse testString ["Maria";"My"]
let parse testString(替换:列表)=
让可变结果=testString
对于索引=1的替换。长度do

结果这里有几种方法可以让你用更惯用的F#来解决这个问题:


请注意,您的代码没有什么特别的错误,F#鼓励采用混合方法来解决问题。如果您限制了可变性和“原始”迭代的范围,它们就不会有问题。在这种情况下,变量永远不会离开函数的作用域,因此它与程序的其余部分无关。

这里有几种方法,您可以用更惯用的F#来解决这个问题:


请注意,您的代码没有什么特别的错误,F#鼓励采用混合方法来解决问题。如果您限制了可变性和“原始”迭代的范围,它们就不会有问题。在这种情况下,变量永远不会离开函数的作用域,因此它与程序的其余部分无关。

在等待宁静的伟大响应时,如果对任何人都有用,我也找到了自己进行匹配计算器和正则表达式的方法

let parseReplacements (matchedIndex: Match) (replacements: list<string>) =
    let indexString = matchedIndex.Groups.[1] |> string
    let index = (indexString |> int) - 1

    if index <= replacements.Length then
        replacements.[index]
    else
        "[" + indexString + "]"

let parse input (replacements: list<string>) =
    Regex.Replace(input, "\[(\d+)\]", new MatchEvaluator(fun matched -> parseReplacements matched replacements))
let parseReplacements(matchedIndex:Match)(replacements:list)=
让indexString=matchedIndex.Groups。[1]|>string
设index=(indexString |>int)-1
如果索引解析(替换匹配替换))

在等待静谧公司的大力响应的同时,我也找到了一种方法,如果对任何人都有用的话,我可以自己做match evaluator和Regex

let parseReplacements (matchedIndex: Match) (replacements: list<string>) =
    let indexString = matchedIndex.Groups.[1] |> string
    let index = (indexString |> int) - 1

    if index <= replacements.Length then
        replacements.[index]
    else
        "[" + indexString + "]"

let parse input (replacements: list<string>) =
    Regex.Replace(input, "\[(\d+)\]", new MatchEvaluator(fun matched -> parseReplacements matched replacements))
let parseReplacements(matchedIndex:Match)(replacements:list)=
让indexString=matchedIndex.Groups。[1]|>string
设index=(indexString |>int)-1
如果索引解析(替换匹配替换))

这里第一个解析函数的忠实粉丝。但你是对的,F#实际上也有一个非常好的语法,只用于过程代码。我还得到了一个正则表达式解决方案,我把它作为一个单独的答案发布了出来,但我更喜欢你的解决方案。但你是对的,F#实际上也有一个非常好的语法,只用于过程代码。我还得到了一个正则表达式解决方案,我已经作为一个单独的答案发布了,但我更喜欢你的。