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#_Fizzbuzz_Active Pattern - Fatal编程技术网

F# 活跃模式的嘶嘶声

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

我试图了解活动模式,所以我在玩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
    | 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:我要么忘记了,要么永远不知道
&
是模式语言的一部分!