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中对象的匹配模式#_F#_F# 3.0 - Fatal编程技术网

F# F中对象的匹配模式#

F# F中对象的匹配模式#,f#,f#-3.0,F#,F# 3.0,我对F#没有任何经验。我这个周末开始读书 我最近遇到了一个问题(C#代码),我必须在.NET对象列表中搜索与特定模式匹配的对象子集 在问题中,我将其描述为“对象的正则表达式样式匹配”。我确实得到了一个很好的解决方案,我对此很满意,而且似乎表现得很好 但我最近对F#的兴趣让我怀疑函数式编程是否有更好的解决方案 你会如何解决这个问题 这是一条作为答案发布的评论,因为它太渴望评论了 因为正则表达式似乎可以解决您的问题,而且您可能会怀疑F#或可能是更好的解决方案,所以我将补充一些理解 我看到的输入R+B

我对F#没有任何经验。我这个周末开始读书

我最近遇到了一个问题(C#代码),我必须在.NET对象列表中搜索与特定模式匹配的对象子集

在问题中,我将其描述为“对象的正则表达式样式匹配”。我确实得到了一个很好的解决方案,我对此很满意,而且似乎表现得很好

但我最近对F#的兴趣让我怀疑函数式编程是否有更好的解决方案

你会如何解决这个问题


这是一条作为答案发布的评论,因为它太渴望评论了

因为正则表达式似乎可以解决您的问题,而且您可能会怀疑F#或可能是更好的解决方案,所以我将补充一些理解

我看到的输入
R+B{3}D+
,因此需要一个解析器和求值引擎,或者创建类似有限状态机的东西。既然你已经知道它可以解决这个问题,为什么要费尽周折用F#来重新创建它呢。即使使用F#模式匹配和活动模式也不会比使用正则表达式更容易

因此,问题基本上是将C代码转换为F代码,并使用正则表达式。所以你要我们把你的C#翻译成F#,这不是一个有效的So问题

编辑

正如马克·希曼在一篇评论中指出的那样,我们唯一的输入是
R+B{3}D+
。因此,如果您的实际语法比正则表达式所能处理的更复杂,那么在F#中,可能是一个更好的解决方案


希望这能帮助你理解你所问的问题。

这是一条作为答案发布的评论,因为它太渴望评论了

因为正则表达式似乎可以解决您的问题,而且您可能会怀疑F#或可能是更好的解决方案,所以我将补充一些理解

我看到的输入
R+B{3}D+
,因此需要一个解析器和求值引擎,或者创建类似有限状态机的东西。既然你已经知道它可以解决这个问题,为什么要费尽周折用F#来重新创建它呢。即使使用F#模式匹配和活动模式也不会比使用正则表达式更容易

因此,问题基本上是将C代码转换为F代码,并使用正则表达式。所以你要我们把你的C#翻译成F#,这不是一个有效的So问题

编辑

正如马克·希曼在一篇评论中指出的那样,我们唯一的输入是
R+B{3}D+
。因此,如果您的实际语法比正则表达式所能处理的更复杂,那么在F#中,可能是一个更好的解决方案


希望这有助于您理解您的问题。

这里有一个有趣的功能概念可能很有用。其思想是使用可组合函数,这些函数描述如何读取一些输入,然后从两个原语组合复杂模式的解析器

解析器通常处理字符串,但没有理由不能使用相同的方法读取染色体序列

使用解析器组合器,您可以将“regex”重写为F#函数的组合。比如:

sequence [ 
  zeroOrMore (chromosomeType R)
  repeat 3 (chromosomeType B)
  zeroOrMore (chromosomeType D) ]
这将为您提供一个函数,该函数获取染色体对象列表并返回解析结果——列表的子集。其思想是,像
zeroOrMore
这样的函数可以构建检测特定模式的解析器,您可以编写函数来构建解析器——您可以得到一个只需在输入上运行即可解析的函数


解释解析器组合词对于SO的答案来说有点太长了,但这可能是解决问题的最惯用的F#方法。

一个有趣的函数概念可能在这里很有用。其思想是使用可组合函数,这些函数描述如何读取一些输入,然后从两个原语组合复杂模式的解析器

解析器通常处理字符串,但没有理由不能使用相同的方法读取染色体序列

使用解析器组合器,您可以将“regex”重写为F#函数的组合。比如:

sequence [ 
  zeroOrMore (chromosomeType R)
  repeat 3 (chromosomeType B)
  zeroOrMore (chromosomeType D) ]
这将为您提供一个函数,该函数获取染色体对象列表并返回解析结果——列表的子集。其思想是,像
zeroOrMore
这样的函数可以构建检测特定模式的解析器,您可以编写函数来构建解析器——您可以得到一个只需在输入上运行即可解析的函数


解释解析器组合符对于SO答案来说有点太长了,但这可能是解决这个问题最惯用的F#方法。

基于其他答案:首先实现一个解析器组合器,允许组合类型
解析器基于其他答案:首先实现一个解析器组合器,允许组合类型
解析器,您可以使用短语吗问得更准确些?事实上,它太宽泛了。我真的不知道我怎么能用不同的措辞来表达这个问题。。。。我在C#中遇到了一个问题,我得到了一个很好的解决方案(上面链接中的所有细节)。等效的F#解是什么?我只是想了解F#以及它如何导致这样的问题……我已经阅读了相关的问题,但是你能分享一下你想应用的词汇吗?
R+B{3}D+
是您希望匹配的唯一模式,还是您需要更丰富的词汇表(例如分组、替换等)?有趣的是:这将为您提供一个示例,说明所涉及的内容。重要的变化是,你能更准确地表达你的问题吗?事实上,它太宽泛了。我真的不知道我怎么能用不同的措辞来表达这个问题。。。。我在C#中遇到了一个问题,我得到了一个很好的解决方案(上面链接中的所有细节)。等效的F#解是什么?只是想了解一下F#a
open ListParser
let runForall (Parser f) xss =
    let rec aux n acc xss =
        match xss, f xss with
        | [], _ -> List.rev acc
        | _::xs, Failure -> aux (n + 1) acc xs
        | _, Success(value, rest) ->
            aux (n + List.length value) ((n + 1, value)::acc) rest
    aux 0 [] xss

type ChromosomeType = R | B | D

[D;R;R;B;B;B;D;D;B;R;R;B;B;B;D;D;R;R;B;B;B;D;D]
|> runForall (oneOrMore R .>>. exactly B 3 .>>. oneOrMore D)
// val it : (int * ChromosomeType list) list =
//   [(2, [R; R; B; B; B; D; D]); (10, [R; R; B; B; B; D; D]);
//    (17, [R; R; B; B; B; D; D])]