Я запускаю Haskell и смотрю на некоторые библиотеки, где типы данных определяются с помощью "!". Пример из библиотеки байтов:
data ByteString = PS {-# UNPACK #-} !(ForeignPtr Word8) -- payload
{-# UNPACK #-} !Int -- offset
{-# UNPACK #-} !Int -- length
Теперь я увидел этот вопрос как объяснение того, что это значит, и я думаю, это довольно легко понять. Но теперь мой вопрос: какой смысл использовать это? Поскольку выражение будет оцениваться всякий раз, когда это необходимо, почему вы вынуждаете раннюю оценку?
Во втором ответе на этот вопрос C.V. Хансен говорит: "[...] иногда накладные расходы на ленивость могут быть слишком большими или расточительными". Предполагается ли это, что он используется для сохранения памяти (сохранение значения дешевле, чем сохранение выражения)?
Объяснение и пример будут замечательными!
Спасибо!
[ EDIT] Я думаю, что я должен был выбрать пример без {- # UNPACK # -}. Поэтому позвольте мне сделать это сам. Будет ли это когда-либо иметь смысл? Да, почему и в какой ситуации?
data MyType = Const1 !Int
| Const2 !Double
| Const3 !SomeOtherDataTypeMaybeMoreComplex