Monad用于跟踪副作用

时间:2015-08-13 11:41:15

标签: haskell monads

在Haskell中,我们有IO monad来处理副作用,但是,它无法表达跟踪副作用,你真的不知道实际发生了什么类型的副作用:

main :: IO ()

在PureScript中,我们有Eff monad,您可以根据类型签名了解哪种类型的副作用:

main :: forall e. Eff (fs :: FS, trace :: Trace, process :: Process | e) Unit

显然,main函数使用了文件系统,跟踪消息到控制台并且能够处理当前进程,我们有一个特定的模块Control.Monad.Eff用于处理副作用以及Control.Monad.Eff.RandomControl.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

这比仅使用更具体,“嘿,这里发生了副作用,就是这样,你不需要知道!”。我正在浏览网页,我没有看到一个完整的monad跟踪副作用。

Haskell中有一个特定的monad,如Eff,用于跟踪副作用吗?

提前致谢。

1 个答案:

答案 0 :(得分:4)

有几个库为Haskell定义了类似的效果系统。

我与extensible-effects进行了一些合作,发现很容易添加限制IO,例如STDIOFileIO,效果。缺乏编译器支持使得使用起来不太好。

如果你想尝试一下,你可以在extensible-effects框架的现有效果中找到灵感:http://hackage.haskell.org/packages/#cat:Effect

似乎有一个extensible-effects版本没有使用Typeable来跟踪效果:http://hackage.haskell.org/package/effin。这应该会使编写新效果更好。