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