Я понимаю и написал типичную функцию набора мощности в F # (аналогично разделу Алгоритмы в Википедии )
Позже я обнаружил эту реализацию powerset, которая кажетсякрасиво и компактно, ожидайте, что я не понимаю этого.
let rec powerset = function
| [] -> [[]]
| h::t -> List.fold (fun xs t -> (h::t)::t::xs) [] (powerset t);
Я разбил это на 1-шаговую нерекурсивную функцию, чтобы найти набор мощности [1; 2], и жестко закодировал значение набора мощности2 в конце [[2];[]]
let right = function
| [] -> [[]]
| h::t -> List.fold (fun acc t -> (h::t)::t::acc) [] [[2]; []];
Вывод [[1]; []; [1; 2]; [2]]
, который является правильным.
Однако я ожидал, что List.Fold выведет [[1; 2]; []; [1; 2]; [2]]
.
Так как я былНе зная о 't', я изменил имена переменных и получил то, что ожидал.Конечно, это не правильный powerset из [1; 2].
let wrong = function
| [] -> [[]]
| h::t -> List.fold (fun acc data -> (h::t)::data::acc) [] [[2]; []];
Для меня 't' (тот, кто веселится, а не h :: t) - это просто имя для второго аргументав «удовольствие», но это, очевидно, не так.Так в чем же разница между написанными мной «правильными» и «неправильными» функциями F #?И что именно здесь означает «*»?
Спасибо!(Я новичок в F #)