Сопоставление с образцом с охранниками vs if / else конструкция в F #

В языках семейства ML люди предпочитают сопоставление с образцом конструкции if / else . В F # использование средств защиты в сопоставлении с образцом во многих случаях может легко заменить if / else .

Например, простая функция delete1 может быть переписана без использования if / else (см. delete2 ):

let rec delete1 (a, xs) =
    match xs with
    | [] -> []
    | x::xs' -> if x = a then xs' else x::delete1(a, xs') 

let rec delete2 (a, xs) =
    match xs with
    | [] -> []
    | x::xs' when x = a -> xs'
    | x::xs' -> x::delete2(a, xs') 

Другой пример - решение квадратичных функций :

type Solution =
    | NoRoot
    | OneRoot of float
    | TwoRoots of float * float

let solve1 (a,b,c) = 
    let delta = b*b-4.0*a*c
    if delta < 0.0 || a = 0.0 then NoRoot 
    elif delta = 0.0 then OneRoot (-b/(2.0*a))
    else 
        TwoRoots ((-b + sqrt(delta))/(2.0*a), (-b - sqrt(delta))/(2.0*a))

let solve2 (a,b,c) = 
    match a, b*b-4.0*a*c with
    | 0.0, _  -> NoRoot
    | _, delta when delta < 0.0 -> NoRoot
    | _, 0.0 -> OneRoot (-b/(2.0*a))
    | _, delta -> TwoRoots((-b + sqrt(delta))/(2.0*a),(-b - sqrt(delta))/(2.0*a))

Должны ли мы использовать сопоставление с образцом с охранниками, чтобы игнорировать уродливую конструкцию if / else ?

Есть ли какое-либо влияние на производительность против использования сопоставления с образцом с охранниками? У меня сложилось впечатление, что это кажется медленным, потому что сопоставление с образцом проверяется во время выполнения.

8
задан Guy Coder 5 February 2017 в 22:21
поделиться