В чем смысл объявления строгости?

Я запускаю 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

11
задан Community 23 May 2017 в 12:04
поделиться