在F#中使用模式匹配的最佳方法是什么?

Sec*_*Son 0 f# tuples inline pattern-matching

创建一个带有两个参数的函数,一个整数和一个五元素的整数元组,如果元组的任何三个元素的总和大于第一个参数,则返回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
Run Code Online (Sandbox Code Playgroud)

The*_*ght 12

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
Run Code Online (Sandbox Code Playgroud)

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