【问题标题】:What's the best way to use pattern matching in F#?在 F# 中使用模式匹配的最佳方法是什么?
【发布时间】:2016-01-14 00:24:05
【问题描述】:

创建一个函数,该函数接受两个参数,一个整数和一个五元素整数元组,如果元组的任何三个元素之和大于第一个参数,则返回 true,否则返回 false。

let func el tupl =
    match tupl with
    |(a,b,c,d,e) when (a+b+c) > el || (a+d+e) > el || (b+c+d)> el || (b+c+e) > el -> true
    | _-> false

【问题讨论】:

  • 能不能直接把5个元组变成一个数组,排序,然后检查数组最后三个数字的和?
  • 你能告诉我如何...我还是 F# 的孩子
  • 你也忘了a+b+da+b+e...
  • 一般来说,如果不同的元素没有各自不同的含义,不要使用元组,而是使用列表或数组。元组不是集合,如果这样使用,很难使用。
  • #TeaDrivenDev 谢谢

标签: f# pattern-matching tuples inline


【解决方案1】:

在这种情况下,使用显式 match 表达式并没有真正的优势,您可以按照您在问题中的建议使用 when 守卫来解决问题,但这会将很多思考负担转移给您。

这是另一种选择:

let inline func el (a,b,c,d,e) =
    let sum3 = 
        [a; b; c; d; e] // create a list of elements
        |> List.sortDescending // sort list by descending
        |> List.take 3 // take the 3 largest elements
        |> List.sum // sum them
    sum3 > el // if not true for 3 largest, it's not true for any

注意:我创建了函数inline,因此它适用于支持comparison+ 的任何类型。您可以删除inline 并接受,例如ints。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-29
    • 2014-04-16
    • 1970-01-01
    • 2011-04-14
    • 1970-01-01
    • 2011-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多