Как справиться с побочным эффектом с Applicative?
Я вижу везде, чтоApplicative
может справиться с побочными эффектами, но все простые примеры, которые я видел, просто объединяют такие вещи, как:
> (,,) <$> [1,2] <*> ["a", "b", "c"] <*> ["foo", "bar"]
[(1,"a","foo"),(1,"a","bar"),(1,"b","foo"),(1,"b","bar"),
(1,"c","foo"),(1,"c","bar"),(2,"a","foo"),(2,"a","bar"),
(2,"b","foo"),(2,"b","bar"),(2,"c","foo"),(2,"c","bar")]
Что круто, но я не вижу, как это связано с побочными эффектами. Я понимаю, чтоApplicative
это слабая монада, и поэтому вы можете обрабатывать побочные эффекты (как вы бы делали с монадой состояния), но вы не можете повторно использовать результат предыдущего побочного эффекта.
Означает ли это, что>>
может быть написано дляApplicative
и тому подобное
do
print' "hello"
print' "world"
будет иметь смысл (сprint' :: a -> Applicative something
) (с соответствующим до-аппликативным расширением).
В другом мире есть разница междуMonad
а такжеApplicative
в том, чтоMonad
позволяетx <- ...
ноApplicative
не делает.
Тогда, монада писателя, просто аппликатив?