Кажется, вы пытаетесь применить различные формулы в зависимости от типа вашего треугольника. Если у вас есть три стороны, вы используете формула Герона , если у вас есть одна сторона, вы предполагаете, что треугольник равносторонний, если у вас есть две стороны, вы полагаете, что треугольник прав, а две стороны являются катетерами. ,
Если бы я правильно истолковал, я бы определил дискриминационный союз, например:
type Triangle =
| Generic of float * float * float
| Equilateral of float
| Right of float * float
let area (t : Triangle) : float =
match t with
| Generic (a, b, c) -> let s = (a + b + c) / 2.
sqrt(s*(s-a)*(s-b)*(s-c))
| Equilateral a -> sqrt(3.) * (a ** 2.) / 4.
| Right (a, b) -> (a * b) / 2.
// testing
let triangles = [Generic (2., 3., 4.); Equilateral 2.; Right (2., 3.)]
triangles |>
List.iter (fun t -> Console.WriteLine(area t))