mod n) $ [1..n-1]
partitions [] = [[]]
partitions (x:xs) = partitions xs >>= (\sub -> [sub, x:sub])
sumDivSet n = filter ((== n) . sum) . partitions $ dividers n
main = putStrLn . unlines . map show $ ((zip <*>) . map) sumDivSet list
where list = [1..400 :: Int]
Он нормально, быстро работает. Если же заменить определение partitions на, вроде бы, эквивалентное
partitions = filterM $ const [False, True]
, то скорость кода заметно падает. Скажите, пожалуйста, с чем это может быть связано?
Выглядит так, как будто упускается возможность для fusion-а. Или эти определения имеют неодинаковую семантику по отношению с ленивости?
Всё-таки, почему такая существенная разница в производительности?
Обсуждают сегодня