Haskell Powerset在Lexicographic Order中

时间:2016-02-05 23:25:35

标签: haskell powerset

我想在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排序为这个顺序?

1 个答案:

答案 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]] 功能的调用的已编辑答案)