Подтвердить что ты не робот

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

Знаете ли вы, есть ли указатели в Haskell?

  • Если да: как вы их используете? Есть ли проблемы с ними? И почему они не популярны?

  • Если нет: есть ли причина для этого?

4b9b3361

Ответ 1

Да, есть. Взгляните на Foreign.Ptr или Data.IORef

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

Ответ 2

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

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

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

Ответ 3

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

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

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