У сказки есть монада IO?
Я изучал сказочную библиотеку и нашел множество полезных конструкций. После использования Задач через control.async и data.task я хотел использовать монаду ввода-вывода, но, похоже, не могу ее найти. Учитывая, насколько богата сказка, я удивляюсь и удивляюсь, не вижу ли я ее просто так.
Есть ли в народной сказке монада IO?
1 ответ
В Haskell монада ввода-вывода обеспечивается (и неотъемлемо связана с) средой выполнения. Folktale не предоставляет функциональных эквивалентов для функций времени выполнения, но в противном случае Task и IO служат одной и той же цели. Действие IO в Haskell может быть асинхронным, поэтому мы можем сказать, что оно даже больше похоже на IO Haskell, чем, например, монада IO в monet.js.
Одно отличие состоит в том, что Task
обеспечивает обработку ошибок, а монада ввода-вывода - нет.
Вы можете программировать, используя Задачи в JS, так же, как вы программируете в Haskell, используя действия ввода-вывода. Вам просто нужно определить все нечистые функции времени выполнения, которые вы используете с помощью Задач.
Например, возьмите функцию print
, (print :: Show a => a -> IO ()
), предоставляемый средой выполнения Haskell, которая просто печатает свой ввод и ничего не возвращает. Мы можем написать аналогичную функцию в JS, используя задачи. Вероятно, это будет выглядеть примерно так.
// Definition
const print = (input) => Task.task(r => {
console.log(String(input))
r.resolve(undefined)
})
// Usage
const main = Task.of("Hello world").chain(print)