Tom*_*rst 44
($!)是严格的功能应用.也就是说,它在评估函数之前评估参数.
这与Haskell中的正常延迟函数应用程序相反,例如,f x或者f $ x,它首先开始评估函数f,并且仅在x需要时计算参数.
例如,succ (1 + 2)将1 + 2通过创建thunk 来延迟添加,并首先开始评估succ.只有在需要succ的参数时才会1 + 2进行评估.
但是,如果您确定始终需要函数的参数,则可以使用($!),首先将参数计算为弱头正规形式,然后输入函数.这样,你就不会创建一大堆thunks,这样可以更有效率.在此示例中,succ $! 1 + 2首先计算3然后输入函数succ.
请注意,用严格的函数应用程序替换普通函数应用程序并不总是安全的.例如:
ghci> const 1 (error "noo!")
1
ghci> const 1 $! (error "noo!")
*** Exception: noo!
Run Code Online (Sandbox Code Playgroud)