F# aligned plain-text terminal table

F#
let renderTable (headers: string list) (rows: string list list) =
    let widths =
        headers :: rows
        |> List.map (List.map String.length)
        |> List.fold (List.map2 max) (headers |> List.map String.length)
    let pad (s: string) width = s.PadRight(width)
    let line cells =
        List.map2 pad cells widths |> String.concat " | " |> sprintf "| %s |"
    let rule =
        widths |> List.map (fun w -> String.replicate w "-") |> String.concat "-+-" |> sprintf "+-%s-+"
    (line headers :: rule :: List.map line rows)
    |> String.concat "\n"

printfn "%s" (renderTable [ "id"; "name" ] [ [ "1"; "ada" ]; [ "22"; "grace" ] ])