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