open System.Collections
let rec flatten (items: IEnumerable) =
seq {
for x in items do
match x with
| :? 'T as v -> yield v
| :? IEnumerable as e -> yield! flatten e
| _ -> failwithf "Expected IEnumerable or %A" typeof<'T>
}
let (!) (l: obj list) = l
let y = ![["1";"2"];"3";[!["4";["5"];["6"]];["7"]];"8"]
let z : string list = flatten y |> Seq.toList
printfn "%A" z
b3BlbiBTeXN0ZW0uQ29sbGVjdGlvbnMKCmxldCByZWMgZmxhdHRlbiAoaXRlbXM6IElFbnVtZXJhYmxlKSA9CiAgc2VxIHsKICAgIGZvciB4IGluIGl0ZW1zIGRvCiAgICAgIG1hdGNoIHggd2l0aAogICAgICB8IDo/ICdUIGFzIHYgLT4geWllbGQgdgogICAgICB8IDo/IElFbnVtZXJhYmxlIGFzIGUgLT4geWllbGQhIGZsYXR0ZW4gZQogICAgICB8IF8gLT4gZmFpbHdpdGhmICJFeHBlY3RlZCBJRW51bWVyYWJsZSBvciAlQSIgdHlwZW9mPCdUPgogIH0KCmxldCAoISkgKGw6IG9iaiBsaXN0KSA9IGwKbGV0IHkgPSAhW1siMSI7IjIiXTsiMyI7WyFbIjQiO1siNSJdO1siNiJdXTtbIjciXV07IjgiXQpsZXQgeiA6IHN0cmluZyBsaXN0ID0gZmxhdHRlbiB5IHw+IFNlcS50b0xpc3QKcHJpbnRmbiAiJUEiIHo=