结合枚举标志考虑以下(可变)例如:避免“让可变”干净与模式匹配和位在fsharp
let getRegexFlax flags =
let mutable res = RegexOptions.None
for ch in flags do
match ch with
| 's' -> res <- res ||| RegexOptions.Singleline
| 'x' -> res <- res ||| RegexOptions.IgnorePatternWhitespace
| 'i' -> res <- res ||| RegexOptions.IgnoreCase
| 'm' -> res <- res ||| RegexOptions.Multiline
| _ -> raise (Exception("invalid flag"))
res
我用这个例子来举例说明,我们经常会遇到的情况。这个想法很简单:基于一个字符串(或任何复杂的条件),您需要组合零个或多个枚举标志。
这样做的最简单的方法,我想,就像上面那样,可变。如果你没有使用可变的,我能想到的其它无数种方法,但似乎都不是很干净:
- 递归函数结合的返回标志(繁琐)
enum.Combine
为唐赛姆表明,与一个如果条件或模式匹配在每个阵列条目(难看)- 长范围的
|||
组合表达式,每个具有一个条件(也难看)
我确信有一种更简单,更直接方式,最好是模式匹配,当然,没有可变性。这可能是一天的最后时刻,但我现在根本想不起来,任何人都可以向我展示光明?
当然(facepalm)'Seq.fold'就是我需要的! – Abel 2014-11-07 03:21:50