korvin:
applegame,
main = myMain $ do
myPutStrLn "first"
myPutStrLn "second"
myPutStrLn "third"
impl
import Control.Applicative
data MyCoolIO a = MCIO (IO a)
instance Functor MyCoolIO where
fmap f (MCIO xIO) = MCIO $ fmap f xIO
instance Applicative MyCoolIO where
pure = MCIO . pure
(MCIO fIO) <*> (MCIO xIO) = MCIO $ fIO <*> xIO
instance Monad MyCoolIO where
return = pure
(MCIO xIO) >>= f = MCIO $ xIO >>= \x -> (let (MCIO r) = f x in r)
(MCIO xIO) >> (MCIO yIO) = MCIO $ yIO >>= \y -> (xIO >> return y)
myPutStrLn :: String -> MyCoolIO ()
myPutStrLn s = MCIO $ putStrLn s
myMain :: MyCoolIO () -> IO ()
myMain (MCIO io) = io
—
https://ideone.com/9nbY5V
Давай, расскажи ещё про порядок в do-выражении.
Добавлено
Цитата applegame @ Значит таки можно писать императивно (по вашему определению) без мутабельных переменных?
В нашем определении есть изменяемое состояние, а не «мутабельные переменные».
Добавлено
Цитата applegame @ Последний - ИП, первые два ФП.
Не угадал.
Добавлено
Цитата applegame @ Откуда такой вывод? Почему все, если я говорил о хаскельном IO, в том числе и о монаде IO?
Оттуда, что do-нотация работает с любой монадой, а не только монадой IO.
Цитата applegame @ Раз возможно IO, значит возможны функции с побочными эффектами.
В Хаскелле нет функций с побочными эффектами.
Цитата applegame @ Потому что парадигма не может измениться если не меняется код Очевидно же.
Попробуй ещё раз поразмыслить над фразой «синтаксис != семантика».
Цитата applegame @ Пример чего?
Пример использования do-нотации с «чистыми» (не-IO) монадами.
Цитата applegame @ В чистой ФП-композиции порядок может быть любым, уже обсуждали и ты вроде согласился. Опять по кругу?
По-моему, это ты согласился, что (foo . bar) и (bar . foo) — не одно и то же. Или ты так и не понял, что это значит?
Цитата applegame @ Ага, а то что эти критерии коррелируют с порядком стейтментов в do-нотации - это просто совпадение?
Не коррелируют.
https://forum.sources.ru/index.php?showtopic=421266&view=findpost&p=3846982