F# 活跃模式的嘶嘶声
我试图了解活动模式,所以我在玩FizzBuzz:F# 活跃模式的嘶嘶声,f#,fizzbuzz,active-pattern,F#,Fizzbuzz,Active Pattern,我试图了解活动模式,所以我在玩FizzBuzz: let (|Fizz|_|) i = if i % 3 = 0 then Some Fizz else None let (|Buzz|_|) i = if i % 5 = 0 then Some Buzz else None let (|FizzBuzz|_|) i = if i % 5 = 0 && i % 3 = 0 then Some FizzBuzz else None let findMatch = function
let (|Fizz|_|) i = if i % 3 = 0 then Some Fizz else None
let (|Buzz|_|) i = if i % 5 = 0 then Some Buzz else None
let (|FizzBuzz|_|) i = if i % 5 = 0 && i % 3 = 0 then Some FizzBuzz else None
let findMatch = function
| Some Fizz -> "Fizz"
| Some Buzz -> "Buzz"
| Some FizzBuzz -> "FizzBuzz"
| _ -> ""
let fizzBuzz = seq {for i in 0 .. 100 -> Some i}
|> Seq.map (fun i -> i, findMatch i)
这基本上是正确的方法,还是有更好的方法来使用活动模式?我不应该让
findMatch
使用int而不是int选项吗 您的findMatch
功能应该是:
let findMatch = function
| FizzBuzz -> "FizzBuzz" (* should be first, as pad pointed out *)
| Fizz -> "Fizz"
| Buzz -> "Buzz"
| _ -> ""
您可以重写最后几行:
let fizzBuzz = Seq.init 100 (fun i -> i, findMatch i)
你的活动模式很好。一种替代方法是使用完整的活动模式:
let (|Fizz|Buzz|FizzBuzz|Num|) i =
match i % 3, i % 5 with
| 0, 0 -> FizzBuzz
| 0, _ -> Fizz
| _, 0 -> Buzz
| _ -> Num i
删除(不必要的)Some
,以便findMatch
函数将int
作为其参数:
let findMatch = function
| FizzBuzz -> "FizzBuzz" (* Should be the first pattern *)
| Fizz -> "Fizz"
| Buzz -> "Buzz"
| _ -> ""
let fizzBuzz = seq { for i in 0..100 -> i, findMatch i }
Daniel的第一个解决方案可以简化,因为实际上不需要为
FizzBuzz
定义单独的活动模式。这种情况可以描述为Fizz
和Buzz
匹配,可以用模式语言很好地表达:
let findMatch = function
| Fizz & Buzz -> "FizzBuzz"
| Fizz -> "Fizz"
| Buzz -> "Buzz"
| _ -> ""
let fizzBuzz = [ for i in 0 .. 100 -> findMatch i ]
如果Fizz
和Buzz
匹配,则模式Fizz&Buzz
匹配。这取决于模式首先匹配的事实,因此在本例中顺序是相关的。我还把你的最后一行缩短了一点,使之成为我更喜欢的风格,并且缩短了一点(但意见各不相同)
或者,如果不想定义太多的单用途活动模式,还可以编写一个参数化活动模式,测试输入是否可被任何指定数字整除:
let (|DivisibleBy|_|) by n = if n%by=0 then Some DivisibleBy else None
let findMatch = function
| DivisibleBy 3 & DivisibleBy 5 -> "FizzBuzz"
| DivisibleBy 3 -> "Fizz"
| DivisibleBy 5 -> "Buzz"
| _ -> ""
不,它需要
int选项
,因为它与一些Fizz
等匹配。首先放置FizzBuzz案例很好。+1:我要么忘记了,要么永远不知道&
是模式语言的一部分!