В языках семейства 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
?
Есть ли какое-то влияние на производительность при использовании сопоставления с образцом для охранников? У меня сложилось впечатление, что это кажется медленным, потому что сопоставление с образцом было проверено во время выполнения.