2016-10-25 2 views
-4

Может кто-нибудь объяснить мне, что означает этот код haskell?Функция Haskell для подсчета подсчета списка

sublists [] = [[]] 
sublists (x:xs) = [x:sublist | sublist <- sublists xs] ++ sublists xs 

Я знаю, что эта функция вычисляет подсписку данного списка. Но я хочу знать, как это работает.

+0

Вы считаете, что изучаете Haskell? – melpomene

+0

Вы не понимаете алгоритм или реализацию алгоритма Haskell? – chepner

+1

Интересная часть состоит в том, почему она выполняет рекурсивный вызов дважды, а не вычисляет его один раз и дважды использует результат. Это на самом деле очень важно. Можете ли вы понять, почему? – dfeuer

ответ

1
sublists :: [a] -> [[a]] 
sublists [] = [[]] 
sublists (x:xs) = [x:sublist | sublist <- sublists xs] ++ sublists xs 

-- ghci> sublists [1,2,3] 
-- [[1,2,3],[1,2],[1,3],[1],[2,3],[2],[3],[]] 

-- (each sublist l1 in (sublists [2 , 3]) 
--  
--  (1 : l1)) 
--  concat (sublists [2, 3]) 
-- 
--  sublists [2, 3] = 
--   (each sublist l2 in (sublists [3]) 
--   (2 : l2)) 
--    concat (sublists [3]) 
-- 
--    sublists [3] = 
--     (3 : []) concat [[]] 
--     = [[3], []] 
--  
-- now substituting back into the recursion 
--  [[2, 3], [2], [3], []] 
--  
-- [[1, 2, 3], [1, 2], [1, 3], [1], [2, 3], [2], [3], []] 
Смежные вопросы