在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.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
这比仅使用更具体,“嘿,这里发生了副作用,就是这样,你不需要知道!”。我正在浏览网页,我没有看到一个完整的monad跟踪副作用。
Haskell中有一个特定的monad,如Eff
,用于跟踪副作用吗?
提前致谢。
答案 0 :(得分: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。这应该会使编写新效果更好。