Какая разница между $ (долларом) и $! (восклицательный знак доллара) - PullRequest
27 голосов
/ 07 мая 2010

Кто-нибудь может объяснить разницу в Haskell между операторами ($) и ($!) (знак доллара против восклицательного знака доллара)?

До сих пор я не видел ни одного случая использования $!, но просматривая Haskell ссылку , я заметил, что она существует и имеет то же определение, что и $.При попытке выполнить несколько простых утверждений в интерпретаторе Haskell ( GHCi ) я не смог найти никаких отличий и не нашел ссылки на оператор в верхних списках учебных пособий при поиске haskell tutorial.

Итак, просто из любопытства, какая разница, если вообще есть?

Ответы [ 2 ]

44 голосов
/ 07 мая 2010

($!) строгое применение функции. То есть он оценивает аргумент перед оценкой функции.

Это противоречит обычному приложению отложенных функций в 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!
7 голосов
/ 07 мая 2010

См. Функцию seq , которая вызывает оценку значения.$!определяется в терминах послед.

Это сообщение в блоге, в котором показаны некоторые нюансы его использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...