Равенство указателей в Хаскеле? - PullRequest
12 голосов
/ 11 ноября 2009

Есть ли какое-либо представление о качестве указателя в Haskell? == требует, чтобы вещи выводили уравнение, и у меня есть что-то, что содержит (Value -> IO Value), и ни ->, ни IO не выводят уравнение.

РЕДАКТИРОВАТЬ: я создаю интерпретатор для другого языка, который имеет равенство указателей, поэтому я пытаюсь смоделировать это поведение, все еще имея возможность использовать функции Haskell для моделирования замыканий.

РЕДАКТИРОВАТЬ: Пример: я хочу функцию special, которая будет делать это:

> let x a = a * 2
> let y = x
> special x y
True
> let z a = a * 2
> special x z
False

Ответы [ 6 ]

12 голосов
/ 12 ноября 2009

РЕДАКТИРОВАТЬ : Учитывая ваш пример, вы можете смоделировать это с монадой IO. Просто назначьте свои функции 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
9 голосов
/ 11 ноября 2009

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

Возможно, что удивительно, на самом деле возможно вычислить равенство экстентов не прекращение) это невозможно.


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

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

5 голосов
/ 12 ноября 2009

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

На самом деле (==) требует экземпляр уравнения, не обязательно производный экземпляр. Вероятно, вам нужно предоставить собственный экземпляр 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'

Может, это поможет?

3 голосов
/ 16 ноября 2009

Еще один способ сделать это - использовать StableNames.

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

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

3 голосов
/ 15 ноября 2009

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

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

3 голосов
/ 11 ноября 2009

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

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

...