169 похожих чатов

Есть ли способ как-то автоматически получать progM из prog? Понимаю,

что прямо так (((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

4 ответов

24 просмотра

получается, что в таком преобразователе мы должны взять процедуру (a -> m b) и превратить её в функцию (a -> b), чтобы передать в первый аргумент ((a -> b) -> c), а это вроде как невозможно

Лев-Дворкин Автор вопроса
Cheese Syrowiecki
получается, что в таком преобразователе мы должны ...

это я понимаю. Именно про это и написал, что не получается

кстати, в progM' можно ограничение на m ослабить до Applicative

progM' :: Applicative m => (Int -> m String) -> m (IO ()) progM' f = mapM_ putStrLn <$> traverse f arr

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Карта сайта