Отказ от ответственности: у меня нет машины с установленным текущим F #, поэтому я не могу проверить свой код. Тем не менее, если вы украли sequence
из Haskell, вы можете написать свою программу как
let cartesian = sequence >> List.map product
и запустите его как
cartesian [[1..99]; [1..99]]
Вот как написать sequence
. Это обобщенная версия выражения последовательности, которое вы написали. Он просто обрабатывает неограниченное количество списков: { 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 ( * )
Тогда вы можете написать свою программу как
let cartesian xs ys = [xs; ys] |> sequence |> List.map product
// ... or one-argument, point-free style:
let cartesian' = sequence >> Seq.map product
Возможно, вам придется изменить Seq
с на List
с.
Однако число людей, которые могут угадать значение вашего необщего понимания списка, вероятно, намного больше, чем распознает имя sequence
, так что вам, вероятно, лучше с пониманием списка. sequence
пригодится в любое время, когда вы захотите запустить целый список выражений вычислений.