2015-08-13 5 views
8

В 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, для отслеживания побочных эффектов?

Заранее спасибо.

+1

хорошо есть все виды побочных эффектов, которые вы хотите? - некоторые из них имеют свои собственные монады (State, ...), и многие библиотеки добавляют еще немного (Yesod, ...) - но я не думаю, что вы не можете их собрать так же, как в PureScript - обычно есть трансформаторы и монады- стека для этого – Carsten

+0

Маленькая нитьчка: 'IO' имеет * эффекты *, а не побочные эффекты. Побочный эффект был бы чем-то злым, как вычисление, притворяющееся чистым, но выполняющее IO через 'unsafePerformIO'. – Cactus

ответ

4

Существует несколько библиотек, которые определяют аналогичные системы эффектов для Haskell.

Я работал с некоторыми extensible-effects, и нашел, что это довольно легко добавить ограничено IO, например STDIO, FileIO, эффекты. Отсутствие поддержки компилятора немного менее приятно использовать.

Если вы хотите попробовать это вы можете найти вдохновение в существующих эффектов для extensible-effects рамок: http://hackage.haskell.org/packages/#cat:Effect

Там, кажется, версия extensible-effects, которая не использует Typeable для отслеживания эффектов: http://hackage.haskell.org/package/effin. Это должно сделать приятнее писать новые эффекты.

Смежные вопросы