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