что прямо так (((a -> b) -> c) -> (a -> m b) -> m c)) написать не выходит, но не могу понять, почему: ведь интуитивно мы можем результат каждого вызова f доставать из монады. Есть идея, что из-за того, что функцию, в принципе, можно использовать как-то по-другому, не применяя, правда не могу придумать примера. Можно ли как-то переписать код, чтоб всё-таки получилось?
prog' :: (Int -> String) -> IO ()
prog' f = mapM_ putStrLn arr'
where
arr' = map f arr
progM' :: Monad m => (Int -> m String) -> m (IO ())
progM' f = do
arr' <- sequence arr'
return $ mapM_ putStrLn arr'
where
arr' = map f arr
получается, что в таком преобразователе мы должны взять процедуру (a -> m b) и превратить её в функцию (a -> b), чтобы передать в первый аргумент ((a -> b) -> c), а это вроде как невозможно
это я понимаю. Именно про это и написал, что не получается
кстати, в progM' можно ограничение на m ослабить до Applicative
progM' :: Applicative m => (Int -> m String) -> m (IO ()) progM' f = mapM_ putStrLn <$> traverse f arr
Обсуждают сегодня