部分活动模式
Partial active pattern
我必须为学校编写一个函数,用于确定一手扑克牌是否有两对。我应该用部分活动模式来做,但我被困在这里。
let (|TwoPairs|_|) (x: (string * string) list) =
x
|> List.groupBy snd
|> List.sortByDescending fst
|> List.filter (fun (_, v) -> v |> List.length = 2)
|> List.length = 2
let x2 =
match [("S", "2"); ("S", "6"); ("S", "6"); ("S", "4"); ("S", "2")] with
| TwoPairs p -> sprintf "Two pairs"
| _ -> "Nothing"
如何将最后一次比较作为选项返回,在这种情况下,Some _ 中应该包含什么?
我认为您的活动模式函数的最后一行非常混乱,因为缩进和运算符优先级导致的隐式分组。我会这样写给 return 一个选项:
let (|TwoPairs|_|) (x: (string * string) list) =
x
|> List.groupBy snd
|> List.sortByDescending fst
|> List.filter (fun (_, v) -> v |> List.length = 2)
|> List.length
|> function 2 -> Some () | _ -> None
当你 return Option<unit>
时,你不必绑定到 p
,因为它是一个单元,代表没有值。所以你会使用这样的模式:
let x2 =
match [("S", "2"); ("S", "6"); ("S", "6"); ("S", "4"); ("S", "2")] with
| TwoPairs -> sprintf "Two pairs"
| _ -> "Nothing"
我不确定在这里使用活动模式是否有任何好处。拥有一个 returns bool 的普通函数并像这样使用它会更简单:
if twoPairs [("S", "2"); ("S", "6"); ("S", "6"); ("S", "4"); ("S", "2")]
then sprintf "Two pairs"
else "Nothing"
我必须为学校编写一个函数,用于确定一手扑克牌是否有两对。我应该用部分活动模式来做,但我被困在这里。
let (|TwoPairs|_|) (x: (string * string) list) =
x
|> List.groupBy snd
|> List.sortByDescending fst
|> List.filter (fun (_, v) -> v |> List.length = 2)
|> List.length = 2
let x2 =
match [("S", "2"); ("S", "6"); ("S", "6"); ("S", "4"); ("S", "2")] with
| TwoPairs p -> sprintf "Two pairs"
| _ -> "Nothing"
如何将最后一次比较作为选项返回,在这种情况下,Some _ 中应该包含什么?
我认为您的活动模式函数的最后一行非常混乱,因为缩进和运算符优先级导致的隐式分组。我会这样写给 return 一个选项:
let (|TwoPairs|_|) (x: (string * string) list) =
x
|> List.groupBy snd
|> List.sortByDescending fst
|> List.filter (fun (_, v) -> v |> List.length = 2)
|> List.length
|> function 2 -> Some () | _ -> None
当你 return Option<unit>
时,你不必绑定到 p
,因为它是一个单元,代表没有值。所以你会使用这样的模式:
let x2 =
match [("S", "2"); ("S", "6"); ("S", "6"); ("S", "4"); ("S", "2")] with
| TwoPairs -> sprintf "Two pairs"
| _ -> "Nothing"
我不确定在这里使用活动模式是否有任何好处。拥有一个 returns bool 的普通函数并像这样使用它会更简单:
if twoPairs [("S", "2"); ("S", "6"); ("S", "6"); ("S", "4"); ("S", "2")]
then sprintf "Two pairs"
else "Nothing"