Я читаю исходный код 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
, который используется для ленивой оценки. Я прав? Или это для других целей?