Я читаю исходный код Data.Map, и я обнаружил, что!() используется в конструкторе данных data Map k a.
data Map k a = Tip
| Bin {-# UNPACK #-} !Size !k a !(Map k a) !(Map k a)
Я нахожу, что !( ) не влияет на то, как сопоставление patten с данными. В функции mapWithKey совпадение patten все еще существует для 5 вещей. Поэтому я не считаю это оператором.
mapWithKey f (Bin sx kx x l r)
После googleing я обнаружил, что !( ) может быть связан с -XBangPatterns, который используется для ленивой оценки. Я прав? Или это для других целей?