我想在Haskell中使用函数声明:
编写一个powerset函数powerset :: Ord a => [a] -> [[a]]
但是,我正在尝试使用词典排序,以便:
powerset [1,2,3] = [[], [1], [1,2], [1,2,3], [1,3], [2], [2,3], [3]]
我已经找到了做其他方法的方法,例如:
powerSet = filterM (const [True, False])
但没有任何以词法顺序提供powerset的东西。有没有办法编写powerset函数来提供或者将未排序的powerset排序为这个顺序?
答案 0 :(得分:3)
你可以做正确的折叠:
// bloodhound
var partsList = new Bloodhound({
datumTokenizer: function (datum) {
return Bloodhound.tokenizers.whitespace(datum.value);
},
queryTokenizer: Bloodhound.tokenizers.whitespace,
remote: {
url: 'pSearch.php?p=%QUERY',
wildcard: '%QUERY',
filter: function (partsList) {
return $.map(partsList, function (itemNumber) {
return {
partNumber: itemNumber.pn,
mfr: itemNumber.mfr,
title: itemNumber.neda
};
});
}
}
});
partsList.initialize();
// typeahead
$('.typeahead').typeahead(null, {
displayKey: 'partNumber',
limit: 9,
source: partsList.ttAdapter(),
templates: {
suggestion: Handlebars.compile("<div><strong>{{partNumber}}</strong> > <div class='subtitle'>{{mfr}} > {{title}}</div></div>")
}
});
然后:
powerset :: Foldable t => t a -> [[a]]
powerset xs = []: foldr go [] xs
where go x acc = [x]: fmap (x:) acc ++ acc
(已删除对\> powerset [1, 2]
[[],[1],[1,2],[2]]
\> powerset [1, 2, 3]
[[],[1],[1,2],[1,2,3],[1,3],[2],[2,3],[3]]
功能的调用的已编辑答案)