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#_Functional Programming_F# Interactive - Fatal编程技术网

F# 部分活动模式

F# 部分活动模式,f#,functional-programming,f#-interactive,F#,Functional Programming,F# Interactive,我必须为学校写一个函数,它从一个扑克牌手判断它是否有两对。我应该用部分活动模式来做,但我被困在这里了 let (|TwoPairs|_|) (x: (string * string) list) = x |> List.groupBy snd |> List.sortByDescending fst |> List.filter (fun (_, v) -> v |> List.length = 2) |> List.l

我必须为学校写一个函数,它从一个扑克牌手判断它是否有两对。我应该用部分活动模式来做,但我被困在这里了

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"

如何返回最后一个比较作为选项,以及在某些情况下应该是什么?

我认为活动模式函数的最后一行非常混乱,因为缩进和由于运算符优先级而导致的隐式分组。我将这样写以返回一个选项:

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
如果返回
选项
,则不必绑定到
p
,因为它是一个单位,表示没有值。因此,您可以使用如下模式:

let x2 =
    match [("S", "2"); ("S", "6"); ("S", "6"); ("S", "4"); ("S", "2")] with
    | TwoPairs -> sprintf "Two pairs"
    | _ -> "Nothing"
if twoPairs [("S", "2"); ("S", "6"); ("S", "6"); ("S", "4"); ("S", "2")]
then sprintf "Two pairs"
else "Nothing"
我不确定在这里使用活动模式是否有任何好处。使用一个返回bool的普通函数并像这样使用它会更简单:

let x2 =
    match [("S", "2"); ("S", "6"); ("S", "6"); ("S", "4"); ("S", "2")] with
    | TwoPairs -> sprintf "Two pairs"
    | _ -> "Nothing"
if twoPairs [("S", "2"); ("S", "6"); ("S", "6"); ("S", "4"); ("S", "2")]
then sprintf "Two pairs"
else "Nothing"

非常感谢。我使用的是主动模式,因为这是一个要求。我只想说的是,这就是所有“请帮我做作业”问题应该是什么样子。它预先声明这是家庭作业,所以我们知道有多少帮助是合适的,问题是“这是我到目前为止所做的,但我还停留在下一步”。干得好+我希望我能给它一个+5。