【问题标题】:Partial active pattern部分活动模式
【发布时间】:2018-05-10 15:51:44
【问题描述】:

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

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 _ 应该是什么?

【问题讨论】:

  • 我只想提一下,this 是所有“请帮我完成作业”问题的样子。它预先声明它是用于家庭作业的,所以我们知道有多少帮助是合适的,问题是“这是我到目前为止所做的,但我被困在下一步”。做得好。为这个问题 +1,我希望我能给它一个 +5。

标签: f# functional-programming f#-interactive


【解决方案1】:

我认为您的活动模式函数的最后一行非常令人困惑,因为缩进和由于运算符优先级导致的隐式分组。我会这样写来返回一个选项:

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

当您返回Option<unit> 时,您不必绑定到p,因为它会是单位并且表示没有值。所以你会使用这样的模式:

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

我不确定在这里使用主动模式是否有任何好处。拥有一个返回 bool 的普通函数并像这样使用它会更简单:

if twoPairs [("S", "2"); ("S", "6"); ("S", "6"); ("S", "4"); ("S", "2")]
then sprintf "Two pairs"
else "Nothing"

【讨论】:

  • 谢谢。我正在使用主动模式,因为这是一个要求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 2014-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-11
相关资源
最近更新 更多