Producto cruzado de dos listas

Jugueteando con 'funciones de extensión' para el módulo Lista. (Pasé bastante tiempo desarrollando 'mapfold', que enhebra un acumulador como fold, pero lo usa como parámetro para crear nuevos valores como map, luego descubrí que eso es lo queList.scan_left hace)

Para la generación de datos de prueba, necesitaba hacer un producto cruzado de dos listas. Esto es lo que se me ocurrió:

///Perform cross product of two lists, return tuple
let crossproduct l1 l2 =
    let product lst v2 = List.map (fun v1 -> (v1, v2)) lst
    List.map_concat (product l1) l2

¿Esto es bueno, o ya hay alguna forma mejor de hacerlo?

La misma pregunta para este:

///Perform cross product of three lists, return tuple
let crossproduct3 l1 l2 l3 =
    let tuplelist = crossproduct l1 l2 //not sure this is the best way...
    let product3 lst2 v3 = List.map (fun (v1, v2) -> (v1, v2, v3)) lst2
    List.map_concat (product3 tuplelist) l3

Respuestas a la pregunta(6)

Su respuesta a la pregunta