2010-03-14 4 views
12

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

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

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

+0

См. Также http://stackoverflow.com/questions/2386210/how-to-get-a-pointer-value-in-haskell –

ответ

19

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

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

+19

Я подозреваю, что он ищет способ обойти большие структуры данных без создания копий , основанный на неправильном предположении, что передача значения функции создает копию, подобную той, которая выполняется при выполнении вызова по значению в C++. – sepp2k

+0

@ sepp2k или для разговора с устройствами с отображением памяти. – 2011-12-16 14:52:27

12

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

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

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

7

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

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

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

+0

Это одна из главных сильных сторон Haskell: вы должны сделать очень мало, чтобы обеспечить эффективность в большинстве случаев. – avpx

Смежные вопросы