Haskell “的语义是什么?”;“严格返回”;?
在wiki部分,未作进一步解释的建议如下:Haskell “的语义是什么?”;“严格返回”;?,haskell,lazy-evaluation,Haskell,Lazy Evaluation,在wiki部分,未作进一步解释的建议如下: 使用严格的返回(return$!…)除非您绝对需要它们 为什么这样做是件好事?什么时候强制执行…-表达式(Whnf-) 给出了“左身份”的单子定律和定义 f $! x = x `seq` f x 我可以重写(在do-notation`)中): PS:如果模式-扩展可用,则为 do !x' <- return x f x' do!有一个你无法从中得到的原因 do x' <- x `seq` return x f x' 这
- 使用严格的返回(
)除非您绝对需要它们李>return$!…
…
-表达式(Whnf-)
给出了“左身份”的单子定律和定义
f $! x = x `seq` f x
我可以重写(在do
-notation`)中):
PS:如果模式
-扩展可用,则为
do !x' <- return x
f x'
do!有一个你无法从中得到的原因
do x' <- x `seq` return x
f x'
这是因为它们不一样。只需扩展do表示法:
(x `seq` return x) >>= (\ x' -> f x')
只有当(>>=)
在其第一个参数中是严格的,才会对seq
求值。这不一定是真的。对于IO,还有一些有用的方法:
强制将其参数计算为
弱头范式
执行结果IO操作。信息技术
可用于订单评估
关于其他IO操作;它的
语义由
我懂了。。。但是这说明了return$代码>?它只对严格的monad有意义吗?@hvr:如果monad的返回类型是严格的,那么是的。对于通常需要评估单子的副作用而不是单子本身的单子,构造特别有用。do块中的最后一件事是return$代码>因为(被调用)函数的返回值总是被计算的。也就是说,在..>=\x->return$代码>,一旦调用lambda表达式,它将计算($!)
应用程序。所谓“lambda表达式被调用”是指仅外部beta减少,还是强制整个lambda应用程序计算为WHNF(在这种情况下,只能由=
/>
操作触发?)?@hvr我是指(\x->…)arg)被评估为WHNF的点。这种情况何时发生取决于这是哪一个单子。
do !x' <- return x
f x'
do x' <- x `seq` return x
f x'
f $! x
(x `seq` return x) >>= (\ x' -> f x')
evaluate :: a -> IO a
evaluate x = (return $! x) >>= return