List ((a -> z -> z) -> z -> z) -> List a?
Пытаюсь решить на codewars.com кату "Lambda Calculus: Lists as folds II". Там списки представлены конструктором List :: ((a -> z -> z) -> z -> z) -> List a и деконструктором foldr :: List a -> (a -> z -> z) -> z -> z (в той кате порядок аргументов не такой, как у обычного foldr).
Я сделал такой вариант:
cons :: a -> List a -> List a
cons v xs = List $ \c nl -> c v (foldr xs c nl)
Он проходит их начальные тесты, но вот на финальных тестах зависает (больше 12 сек тесты работают и останавливаются с ошибкой).
Как можно по-другому реализовать?? Всю голову сломал.
Притом, что варианты
cons v xs = List $ \c nl -> c v nl
cons v xs = List $ \c nl -> foldr xs c nl
не приводят к зависанию (но приводят к непрохождению тестов, конечно)
бесит, что локально не запустить, ибо не хватает много кода
Обычно в заданиях дают куски кода для локального запуска. Ну а в данном случае нужно только определение List и свой foldr (с перевёрнутыми аргументами), всё.
Обсуждают сегодня