Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell “与”的区别是什么;评估“;及;返回美元&引用;?_Haskell_Io_Monads_Evaluation_Io Monad - Fatal编程技术网

Haskell “与”的区别是什么;评估“;及;返回美元&引用;?

Haskell “与”的区别是什么;评估“;及;返回美元&引用;?,haskell,io,monads,evaluation,io-monad,Haskell,Io,Monads,Evaluation,Io Monad,以下是评估文档的摘录: Control.Exception.Base.evaluate :: a -> IO a 不一样 return $! x 正确的定义是 evaluate x = (return $! x) >>= return () 这些似乎具有相同的含义。这两个定义有什么区别 快速参考: 评估的类型为: evaluate :: a -> IO a seq的类型为a->b->b。它首先计算第一个参数,然后返回第二个参数 评估遵循以下三条规则: evalua

以下是
评估
文档的摘录:

Control.Exception.Base.evaluate :: a -> IO a
不一样

return $! x
正确的定义是

evaluate x = (return $! x) >>= return
()

这些似乎具有相同的含义。这两个定义有什么区别

快速参考:

评估的类型为:

evaluate :: a -> IO a
seq
的类型为
a->b->b
。它首先计算第一个参数,然后返回第二个参数

评估遵循以下三条规则:

evaluate x `seq` y    ==>  y
evaluate x `catch` f  ==>  (return $! x) `catch` f
evaluate x >>= f      ==>  (return $! x) >>= f

return$之间的差异!x
(return$!x)>>=return
通过以下表达式变得明显:

evaluate undefined `seq` 42
根据第一条规则,这必须计算为42

使用
返回$!x
definition,上述表达式将导致未定义的异常。这是有价值的⊥, 这不等于42

使用
(return$!x)>=return
定义,它等于42

基本上,
返回$!计算IO值时,x
形式是严格的。另一种形式仅在运行IO值并使用值时才严格(使用
>=


有关更多详细信息,请参阅。

这是否真的违反了单子定律?@leftaroundabout不,它没有。如果运行,两者的行为完全相同,但是如果您
seq
表达式,
返回$!x
有一个
seq
最外层,而
(return$!x)>>=return
有一个
(>>=)
最外层。@leftaroundaound:No,因为⊥ 就法律而言,被忽略。像
Reader
这样的标准单子的行为方式相同。(我不相信丹尼尔·菲舍尔(Daniel Fischer)的观点(我以前从其他人那里听说过),因为“跑步时表现完全一样”并不是一个定义明确的概念。)@DanielFischer我不确定你的说法是否正确
`seq`
的优先级低于
>=
-
>=
怎么可能是最外层的呢?@mucaho我刚才说的两个表达式将成为
seq
的参数。在
seq(return$!x)
中,
return$!x
有一个
seq
[来自
$!
]最外层,而在
seq((return$!x)>=return)
中,
(return$!x)>=return
有一个
>=
最外层。为什么
(return$!undefined)>=return
return$不同!未定义的
?我猜前者引入了一个额外的间接层,它可以防止
未定义的
中被计算((return$!undefined)>=return)`seq`42
evaluate undefined `seq` 42