繁体   English   中英

为什么haskell评估a >> b?

[英]Why does haskell evaluate a in a >> b?

haskell中Monads的>>运算符通常定义为

(>>) :: m a -> m b -> m b
a >> b = a >>= \_ -> b

它可以用来打印像

main = putStr "foo" >> putStrLn "bar"

为什么编译器没有优化putStr "foo"的值而只评估putStrLn "bar" 它不需要它,为什么要计算呢?

正如克里斯所说,这取决于monad。 IdentityReader不会评估>>前面的部分,因为它们不需要它来计算结果。 其他monad,如WriterMaybeEitherStateIO会。

我们以Maybe为例。 >>=定义为

Nothing  >>= _  = Nothing
(Just x) >>= f  = f x

所以,如果我们扩展>>我们得到

Nothing  >> _  = Nothing
(Just x) >> y  = y

所以Maybe必须评估>>前面的内容,看看结果是否为Nothingy

IO是以某种方式有目的地定义的,以便评估操作是否需要其结果(否则将无法使用)。

咦? 当然它需要putStr "foo"的值。 它在>>=进行评估 - 只有动作的结果被抛弃,而不是动作本身,如果你想将monads视为动作。

例如,在解析器中,这意味着丢弃刚刚解析的序列 - 但它仍然被解析,因此光标仍然向前移动。

这取决于monad。 在IO中进行评估。 在Identity中,第一个未评估:

> import Control.Monad.Identity
> import Control.Monad.Trace
> let x = trace "x" $ return () :: Identity ()
> let y = trace "y" $ return () :: Identity ()
> runIdentity $ x >> y
y
()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM