【发布时间】:2011-05-25 15:24:27
【问题描述】:
我理解并用 F# 编写了一个典型的幂集函数(类似于 Wikipedia 中的 算法 部分)
后来我发现这个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',我修改了变量名,我确实得到了我所期望的。当然,这不是 [1;2] 的正确幂集。
let wrong = function
| [] -> [[]]
| h::t -> List.fold (fun acc data -> (h::t)::data::acc) [] [[2]; []];
对我来说,'t'(有趣而不是 h::t)只是 'fun' 的第二个参数的名称,但显然不是这样。那么我写的“正确”和“错误”F#函数有什么区别呢?而这里的“不”到底指的是什么?
谢谢! (我是 F# 新手)
【问题讨论】: