Равенство указателя в Haskell?

Способ сделать это должно управлять location.hash, когда Ajax обновляет результат в изменении состояния, что требуется иметь осторожный URL. Например, если URL Вашей страницы:

http://example.com/

, Если клиентская функция выполнила этот код:

// AJAX code to display the "foo" state goes here.

location.hash = 'foo';

Затем URL, отображенный в браузере, был бы обновлен к:

http://example.com/#foo

Это позволяет пользователям отмечать состояние "нечто" страницы и использовать историю браузера для навигации между состояниями.

С этим механизмом на месте, необходимо будет тогда проанализировать часть хеша URL на стороне клиента с помощью JavaScript, чтобы создать и отобразить соответствующее начальное состояние, поскольку идентификаторы фрагмента (часть после #) не отправляются на сервер.

hashchange плагин Ben Alman делает последнего бризом при использовании jQuery.

12
задан Claudiu 12 November 2009 в 00:09
поделиться

6 ответов

РЕДАКТИРОВАТЬ : В вашем примере вы можете смоделировать это с помощью монады ввода-вывода. Просто назначьте свои функции IORefs и сравните их.

Prelude Data.IORef> z <- newIORef (\x -> x)
Prelude Data.IORef> y <- newIORef (\x -> x)
Prelude Data.IORef> z == z
True
Prelude Data.IORef> z == y
False
12
ответ дан 2 December 2019 в 04:17
поделиться

Равенство указателя нарушило бы ссылочную прозрачность , поэтому НЕТ.

Возможно, удивительно, что на самом деле возможно вычислить экстенсиональное равенство общих функций на компактных пространствах , но в целом (например, функции на целых числах с возможным незавершением) это невозможно.


РЕДАКТИРОВАТЬ: Я создаю интерпретатор для другого языка

Можете ли вы просто сохранить исходный AST программы или местоположение исходного кода вместе с функциями Haskell, в которые вы их перевели? Похоже, вы хотите "равенства" на этом основании.

9
ответ дан 2 December 2019 в 04:17
поделиться

== требует, чтобы вещи выводили уравнение

На самом деле (==) требует экземпляра уравнения, не обязательно производный экземпляр . Что вам, вероятно, нужно сделать, так это предоставить ваш собственный экземпляр Eq, который просто игнорирует часть (Value -> IO Value) . Например,

data D = D Int Bool (Value -> IO Value)

instance Eq D where
  D x y _ == D x' y' _ = x==x && y==y'

Может быть, это поможет?

5
ответ дан 2 December 2019 в 04:17
поделиться

IORefs выводит уравнение. Я не понимаю, что еще нужно, чтобы получить равенство указателя.

Изменить: Единственное, что имеет смысл сравнивать равенство указателя, - это изменяемые структуры. Но, как я упоминал выше, изменяемые структуры, такие как IORefs, уже имеют экземпляр Eq, что позволяет вам увидеть, являются ли два IORef одной и той же структурой, что является в точности равенством указателей.

3
ответ дан 2 December 2019 в 04:17
поделиться

Другой способ сделать это - использовать StableNames.

Однако special должен возвращать свои результаты внутри монады ввода-вывода, если вы не хотите злоупотреблять unsafePerformIO.

Решение IORef требует ввода-вывода на протяжении всего строительства вашей структуры. Проверка StableNames использует его только тогда, когда вы хотите проверить ссылочное равенство.

3
ответ дан 2 December 2019 в 04:17
поделиться

Я создаю интерпретатор для другой язык, на котором есть равенство указателей, поэтому я пытаюсь моделируйте это поведение, пока возможность использовать функции Haskell для моделирования закрытия.

Я почти уверен, что для написания такого интерпретатора ваш код должен быть монадическим. Разве вам не нужно поддерживать какую-то среду или состояние? Если это так, вы также можете поддерживать счетчик закрытий функций. Таким образом, всякий раз, когда вы создаете новое закрытие, вы присваиваете ему уникальный идентификатор. Затем для эквивалентности указателя вы просто сравниваете эти идентификаторы.

3
ответ дан 2 December 2019 в 04:17
поделиться
Другие вопросы по тегам:

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