Produto cruzado de duas listas

Brincando com 'funções de extensão' para o módulo Lista. (Passei um bom tempo desenvolvendo 'mapfold' - que encadea um acumulador como fold, mas o usa como parâmetro para criar novos valores como map - e descobri que é isso queList.scan_left faz)

Para geração de dados de teste, eu precisava fazer um produto cruzado de duas listas. Foi o que eu vim com:

///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

Isso é bom ou já existe uma maneira melhor de fazer isso?

Mesma pergunta para esta:

///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

questionAnswers(6)

yourAnswerToTheQuestion