Haskell “的语义是什么?”;“严格返回”;?

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' 这

在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'
这是因为它们不一样。只需扩展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