последнего эл-та
zip x ((const True <$> drop 1 x)++[False])
но можно лучше?
не drop, а init?
Я человек простой, мне рекурсию проще читать, если она записана как рекурсия f [] = [] f [x] = [(x,False)] f (x:xs) = (x,True) : f xs
Этот вариант даже не рассматривается
слишком боринг или есть объективные причины?
Отдельная функция, которую приходится записывать на toplevel
так-то в where можно отправить, но сделать ее безымянной, да не получится.
snd . foldr (\x (b, xs) -> (True, (x, b):xs)) (False, [])
zip xs ((tail xs $> False) ++ [True])
очевидно же: import Control.Exception import Data.IORef import System.IO.Unsafe lastIsFalse :: [Bool] lastIsFalse = unsafePerformIO $ do ref <- newIORef False let go = do b <- unsafeInterleaveIO $ readIORef ref bs <- unsafeInterleaveIO $ do writeIORef ref True _ <- evaluate b writeIORef ref False go pure $ b : bs go walk :: [a] -> [a] walk = foldr (\x r -> (:) x $! r) [] -- >>> test -- [(1,True),(2,True),(3,True),(4,True),(5,False)] test = walk $ take 5 $ zip [1..] lastIsFalse
написал про это пост: https://github.com/effectfully/sketches/tree/master/a-law-breaking-hack
Там же сразу по куску кода видно что оно будет ломаться при разном порядке вычисления (хотя читаю дальше)
ну я попытался это замаскировать в целях сторителлинга
Обсуждают сегодня