Haskell 用于跟踪副作用的Monad
在Haskell中,我们使用了Haskell 用于跟踪副作用的Monad,haskell,monads,Haskell,Monads,在Haskell中,我们使用了IOmonad来处理副作用,尽管它无法明确跟踪副作用,但您并不知道真正发生的副作用类型: main :: IO () 在PureScript中,我们有Effmonad,您可以根据类型签名知道发生了什么类型的副作用: main :: forall e. Eff (fs :: FS, trace :: Trace, process :: Process | e) Unit 这里很明显,main函数使用了文件系统,跟踪消息到控制台,并且能够处理当前流程,其中我们有一个
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.Eff
导入控制.Monad.Eff.Random(随机)
导入控制.Monad.Eff.Console(打印)
printRandom::forall e。Eff(控制台::控制台,随机::随机| e)单元
printRandom=do
n有几个库为Haskell定义了类似的效应系统
我使用过一些,发现添加受限的IO
,例如STDIO
,FileIO
,效果非常容易。由于缺少编译器支持,使用起来就不那么好了
如果您想尝试一下,您可以从现有的可扩展效果
框架效果中找到灵感:
似乎有一个版本的可扩展效果
没有使用可键入的
来跟踪效果:。这会让写新的效果更好。嗯,有各种各样的副作用,那么你想要哪一种其中一些有自己的monad(State,…),许多lib引入了更多的monad(Yesod,…)-但我想你不能像在PureScript中那样组装它们-通常会有转换器和monad堆栈概念来实现这一点一点挑剔:IO
有效果,而不是副作用。副作用可能是一些邪恶的东西,比如假装纯粹的计算,但通过unsafePerformIO
执行IO。