Что делает класс Storable в Haskell

Я читал некоторую документацию по Haskell C FFI. И я только что столкнулся с классом под названием Storable, который я не очень хорошо понимаю.

Являются ли экземпляры этого типа, эти типы должны иметь "указатель" к ним, в то время как они взаимодействуют с кодом C?

И что делают отдельные функции sizeOf, alignment, peek, poke? Кажется, что peek и poke используются для чтения данных или записи данных в место в памяти, на которое указывает Ptr a. Это правильно?

Но я не знаю, что означают sizeOf и alignment. Может ли кто-нибудь привести примеры для разъяснения их использования?

Ответ 1

Haskell сохраняет значения в памяти способом, который очень несовместим с C. В результате невозможно вызвать функцию C из haskell и передать ему значения haskell напрямую. Вместо этого вам нужно создать копию значения, но не точную копию, а скорее в формате, понятном C. То, что делает Storable. Таким образом, он по существу обеспечивает способ сериализации значений haskell в дружественном формате C (например, мыслите C-структуры). Он также поддерживает противоположную операцию, он может десериализовать значения. Это полезно, когда функция C вызывается из haskell и возвращает сложное (т.е. Не примитивное) значение.

Сериализация/десериализация происходит с помощью poke/peek. sizeOf возвращает размер байта представления C значения. Обратите внимание, что этот механизм работает только для значений, имеющих представление C фиксированного размера (например, structs). Он не поддерживает такие вещи, как строки C, они обрабатываются по-другому. Что касается alignment, он использовался для обеспечения того, чтобы выделение памяти на земле haskell удовлетворяло требованиям выравнивания платформы.