($!)
строгое применение функции. То есть он оценивает аргумент перед оценкой функции.
Это противоречит обычному приложению отложенных функций в Haskell, например f x
или f $ x
, которые сначала начинают оценивать функцию f
, и вычисляют аргумент x
, только если это необходимо.
Например, succ (1 + 2)
задержит добавление 1 + 2
путем создания thunk и начнет сначала оценивать succ
. * Если аргумент succ необходим, 1 + 2
будет оцениваться.
Однако, если вы точно знаете, что аргумент функции всегда будет необходим, вы можете использовать ($!)
, который сначала оценит аргумент в нормальной форме слабой головы, а затем введет функцию. Таким образом, вы не создаете целую кучу громов, и это может быть более эффективным. В этом примере succ $! 1 + 2
сначала вычислит 3
, а затем введет функцию succ
.
Обратите внимание, что не всегда безопасно просто заменить обычное применение функции на строгое применение функции. Например:
ghci> const 1 (error "noo!")
1
ghci> const 1 $! (error "noo!")
*** Exception: noo!