if/else
MLファミリーの言語では、人々は構築するためにパターンマッチングを好む傾向があります。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
醜い構成を無視するために、ガードとのパターンマッチングを使用する必要がありますか?
ガードでパターンマッチングを使用することに対するパフォーマンスへの影響はありますか?実行時にパターンマッチングがチェックされているので遅いようです。