用奇数长度haskell编程打印列表的子列表

用奇数长度haskell编程打印列表的子列表,haskell,Haskell,我想打印长度为奇数的列表子列表。我把这个编码了 sublists :: [a] -> [[a]] sublists [] = [[]] sublists (x:xs) = if odd (length (tail xs)) then [x:sublist | sublist <- sublists xs] ++ sublists xs else sublists xs 子列表::[a]->[[a]] 子列表[

我想打印长度为奇数的列表子列表。我把这个编码了

sublists :: [a] -> [[a]]
sublists [] = [[]]
sublists (x:xs) = if odd (length (tail xs))
                  then [x:sublist | sublist <- sublists xs] ++ sublists xs 
                  else sublists xs
子列表::[a]->[[a]]
子列表[]=[[]]
子列表(x:xs)=如果为奇数(长度(尾部xs))
然后[x:sublist | sublist我想我会重新使用,直到我非常确定这是瓶颈。特别是因为你似乎习惯于调用
长度
,似乎效率不是一个大问题。因此:

Data.List> filter (odd . length) . subsequences $ [1..4]
[[1],[2],[3],[1,2,3],[4],[1,2,4],[1,3,4],[2,3,4]]

为什么不需要长度为5的子序列?从
oddSublists=filter oddsublength.allSublists
开始,然后写入
oddslength::[a]->Bool
allSublists::[a]->[a]