Haskell 用于跟踪副作用的Monad

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函数使用了文件系统,跟踪消息到控制台,并且能够处理当前流程,其中我们有一个

在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.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。