I think the crux of the problem you are encountering is called the expression problem.
Functional code using algebraic data types sits on one side, where it is very to define an initial problem domain and to create and add new functions that operate on that domain. On the other hand, it is rather difficult, especially once you have developed a portfolio of functions to add types to the initial domain.
Object oriented code sits on the other side of the problem. Once you have defined your initial problem domain, it becomes extremely difficult to add new functionality because all of the types must be extended to implement it but it is relatively easy to extend the domain to new problems.
Consider
type Shape =
|Circle of float
|Square of float * float
module Shapes =
let area = function
|Circle r -> Math.PI * r ** 2.0
|Square (a, b) -> a*b
let perimeter = function
|Circle r -> 2.0 * Math.PI * r
|Square (a, b) -> 2.0 * (a + b)
Here, it's easy to add functions because I can just define behaviour for each type of shape but it's hard to add new shapes because I have to edit every function.
[<AbstractClass>]
type Shape() =
abstract member Area : double
abstract member Perimeter : double
type Circle(r) =
inherit Shape()
override this.Area = Math.PI * r **2.0
override this.Perimeter = 2.0 * Math.PI * r
type Square(a, b) =
inherit Shape()
override this.Area = a*b
override this.Perimeter = 2.0 * (a+b)
Using OO, it's easy to add new shapes but it's hard to new properties or methods to Shape because I have to edit every type.
I don't know if you've ever used the visitor pattern in object oriented programming but the need for that pattern arises from the difficulty of expressing structures that can be readily expressed by algebraic data types in functional programming.
One of the great things about F# as a general purpose programming language is that you can decide which method of expressing a particular problem you want to use on a problem by problem basis. That gives you a huge amount of flexibility to pick the optimal approach to your software design.