replaceWithMin :: [Int] -> [Int] replaceWithMin l = finalList where (finalMin, finalList) = foldl' (\(curMin, curList) x -> (curMin min x, finalMin:curList)) (maxBound, []) l
Очень понравился в свое время факт про оптимизатор, что он редуцирует последовательные мапы, фильтры и фолды до единичных, применяя простое правило(похожее на гомоморфизм). Надеюсь когда-нибудь найти время, чтобы поизучать ghc
Нуок, раз пошли варианты, то вот repmin i = let f xss y = case xss of { [x] -> ([y], x); (x:xs) -> bimap (y:) (min x) (f xs y) } in fst (fix (f i . snd))
Выше, когда писал свой однострочник, из-за лени написал без учета пустого списка. А сейчас почему-то "неправильно вспомнил", что это и была изначальная постановка задачи(