Descargo de responsabilidad: No tengo una máquina con el F # actual instalado, así que no puedo probar mi código. Básicamente, sin embargo, si usted roba sequence
de Haskell, se puede escribir el programa como
let cartesian = sequence >> List.map product
y ejecutarlo como
cartesian [[1..99]; [1..99]]
se explica cómo escribir sequence
aquí. Es una versión generalizada de la expresión de secuencia que escribiste. Solo maneja un número ilimitado de listas: { for x in xs do for y in ys do for z in zs ... yield [x;y;z;...] }
.
let rec sequence = function
| [] -> Seq.singleton []
| (l::ls) -> seq { for x in l do for xs in sequence ls do yield (x::xs) }
// also you'll need product to do the multiplication
let product = Seq.fold_left1 (*)
Entonces se puede escribir el programa como
let cartesian xs ys = [xs; ys] |> sequence |> List.map product
// ... or one-argument, point-free style:
let cartesian' = sequence >> Seq.map product
Es posible que tenga que cambiar algunos Seq
s a List
s.
Sin embargo, la cantidad de personas que pueden adivinar el significado de su lista de comprensión no general es probablemente mucho mayor que la que reconocerá el nombre sequence
, por lo que probablemente esté mejor con la lista comprendida. sequence
es útil en cualquier momento que desee ejecutar una lista completa de expresiones de cálculo.
Pregunta relacionada aquí: http://stackoverflow.com/questions/482866/f-cross-product-of-two-lists – Benjol