Кажется, вы пытаетесь применить различные формулы в зависимости от типа треугольника у вас есть. Если у вас есть три стороны, вы используете Heron's formula, если у вас есть одна сторона, вы предполагаете, что треугольник равносторонний, если у вас есть две стороны, вы предполагаете, что треугольник прав, а обе стороны - это катхети. Если бы я правильно интерпретировал, я бы определил дискриминационный союз, например:
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))
Домашнее задание, возможно? – DOK
Нет, не домашнее задание. Пытаюсь, но я не уверен, что это лучшее решение. – Kai
'code'let area abc = let s = sqrt ((a + b + c)/2) sqrt (s * (s - a) * (s - b) * (s - c)); ' – Kai