В Haskell у нас есть монада IO
, чтобы иметь дело с побочными эффектами, хотя он не способен выражать выразительные слежки за побочными эффектами, вы действительно не знаете, какой тип побочного эффекта действительно происходит:Monad для отслеживания побочных эффектов
main :: IO()
в PureScript, мы имеем Eff
монады, где вы сможете узнать, какой тип побочных эффектов произойдет в соответствии с типом подписи:
main :: forall e. Eff (fs :: FS, trace :: Trace, process :: Process | e) Unit
Здесь ясно, что main
Функция использует файлы filesys tem, отслеживания сообщений на консоли и может обрабатывать текущий процесс, где у нас есть специальный модуль Control.Monad.Eff
для обработки побочных эффектов и подмодулей, таких как Control.Monad.Eff.Random
и Control.Monad.Eff.Console
.
Принимая пример следующим образом:
module RandomExample where
import Prelude
import Control.Monad.Eff
import Control.Monad.Eff.Random (random)
import Control.Monad.Eff.Console (print)
printRandom :: forall e. Eff (console :: CONSOLE, random :: RANDOM | e) Unit
printRandom = do
n <- random
print n
Это намного более конкретно, чем при использовании только «Эй, здесь происходит побочный эффект, это так, не больше, что вам нужно знать!». Я просматриваю Интернет, и я не видел, чтобы монада была достаточно полной, чтобы отслеживать побочные эффекты.
Есть ли конкретная монада в Haskell, например Eff
, для отслеживания побочных эффектов?
Заранее спасибо.
хорошо есть все виды побочных эффектов, которые вы хотите? - некоторые из них имеют свои собственные монады (State, ...), и многие библиотеки добавляют еще немного (Yesod, ...) - но я не думаю, что вы не можете их собрать так же, как в PureScript - обычно есть трансформаторы и монады- стека для этого – Carsten
Маленькая нитьчка: 'IO' имеет * эффекты *, а не побочные эффекты. Побочный эффект был бы чем-то злым, как вычисление, притворяющееся чистым, но выполняющее IO через 'unsafePerformIO'. – Cactus