Да, странновато. Куда логичнее выделять CAF'ы, ибо они
can either be compiled to a piece of graph which will be shared by all uses or to some shared code which will overwrite itself with some graph the first time it is evaluated
Но они при этом вовсе не обязаны иметь тип не функции.
Нет, состояние — частный случай монады, чуть выше я привел комментарий с примерами. Но если говорить конкретно о IO, то IO так и определён, как функция, принимающая старое состояние, и возвращающая новое + какой-то результат:
newtype IO a = IO (State# RealWorld -> (# State# RealWorld, a #))
IO является при этом монадой, но не всякая монада — IO.
Чтобы быть монадою (в Haskell), для типа должны быть определены операции (также удовлетворяющие некоторым законам):
return :: a -> m a --
(>>=) :: m a -> (a -> m b) -> m b
Что позволяет использовать в применении к этому типу синтаксический сахар do, например, или просто набор библиотечных монадических функций.
Например, в C# — LINQ — аналог монады, может быть реализован для разных типов. В Scala, насколько я знаю, это for с его for (x < — ...; y < — ...). Там тоже надо реализовать пару функций и можно использовать в for любой тип.
Нет, монадическая функция, это функция оперирующая монадою. Она вовсе не обязана менять какое-то состояние или иметь к ним хоть какое-то отношение, так как монада — не о состояниях, это более общий случай. Например replicateM — монадическая функция, и, к примеру
Но они при этом вовсе не обязаны иметь тип не функции.
Т.е. это не функция:
Зато это — функция:
Я лично ввожу их в SublimeText с дополнением UnicodeMath
IO является при этом монадой, но не всякая монада — IO.
Чтобы быть монадою (в Haskell), для типа должны быть определены операции (также удовлетворяющие некоторым законам):
Что позволяет использовать в применении к этому типу синтаксический сахар do, например, или просто набор библиотечных монадических функций.
Например, в C# — LINQ — аналог монады, может быть реализован для разных типов. В Scala, насколько я знаю, это for с его for (x < — ...; y < — ...). Там тоже надо реализовать пару функций и можно использовать в for любой тип.
или
однако
И никакого состояния в последнем случае нет, ибо монада тут списочная, а не монада состояния или IO, как в примерах выше.
Нету, если не считать unsafePerformIO, бо IO a таки принимает аргументы
(особенно про обеднённый уран)