У Haskell есть указатели?

Вы можете использовать std::unique_ptr для этой цели, которая реализует шаблон RAII. Например:

vector v{};
v.push_back(42);
unique_ptr>
    p{&v, [] (decltype(v)* v) { if (uncaught_exception()) { v->pop_back(); }}};
throw exception(); // rollback 
p.release(); // explicit commit

Функция удаления из unique_ptr p возвращает ранее введенное значение, если область была оставлена ​​при активном исключении. Если вы предпочитаете явное коммит, вы можете удалить вопрос uncaugth_exception() в функции делетера и добавить в конце блока p.release(), который освобождает указатель. См. Демо здесь.

13
задан studiohack 16 November 2011 в 04:01
поделиться

3 ответа

Да, есть. Посмотрите Foreign.Ptr или Data.IORef

Я подозреваю, что это не то, о чем вы спрашиваете. Поскольку Haskell по большей части не имеет состояния, это означает, что указатели не вписываются в дизайн языка. Наличие указателя на память вне функции означает, что функция больше не является чистой, а разрешение указателей только на значения внутри текущей функции бесполезно.

23
ответ дан 1 December 2019 в 18:12
поделиться

Haskell действительно предоставляет указатели через расширение интерфейса внешней функции. Взгляните, например, на Foreign.Storable .

Указатели используются для взаимодействия с кодом C. Не на каждый день программирования на Haskell.

Если вы ищете ссылки - указатели на объекты, которые вы хотите изменить, - есть STRef и IORef , которые служат во многих из тех же целей, что и указатели. Тем не менее, вам редко - если вообще когда-либо - понадобится Refs.

12
ответ дан 1 December 2019 в 18:12
поделиться

Если вы просто хотите избежать копирования больших значений, как предполагает sepp2k, тогда вам не нужно ничего делать: в большинстве реализаций все нетривиальные значения размещаются отдельно в куче и ссылаются друг на друга по адресам машинного уровня (то есть указателям). Но, опять же, вам не нужно ничего делать, об этом позаботятся вы.

Чтобы ответить на ваш вопрос о том, как передаются значения, они передаются любым способом, который реализация считает подходящим: поскольку вы все равно не можете изменять значения, это не влияет на смысл кода (пока строгость уважается); обычно это срабатывает по необходимости, если вы не проходите мимо, например. Значения Int, которые может видеть компилятор, уже были оценены ...

Передача по необходимости аналогична передаче по ссылке, за исключением того, что любая заданная ссылка может относиться либо к фактическому оцененному значению (которое не может быть изменено), либо или «преобразователю» для еще не оцененного значения. В Википедии есть еще .

7
ответ дан 1 December 2019 в 18:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: