2015-03-28 3 views
3

есть способ получить адрес элемента данных (например, элемент списка) в Haskell.Haskell: получить адрес памяти в списке

combineLists :: [a] -> [a] -> [a] 

combineLists [] y = y 
combineLists (x:xs) y = x : combineLists xs y 

*Main> let x=[1,23, 12, 45] 
*Main> x 
[1,23,12,45] 
*Main> let y =[90, 56, 78] 
*Main> y 
[90,56,78] 
*Main> let z = combineLists x y 
*Main> z 
[1,23,12,45,90,56,78] 

Теперь бы z быть полностью построен путем копирования элементов из й и у (внутреннее представления Haskell) или

будет г-то вроде: г = [[копия всех элементов х] у]

Я хотел посмотреть, & y == & z [4] (z [4] = 90).

Также есть способ сбросить внутреннее представление, используя что-то похожее на ctypes в Python.

Спасибо.

+1

Список не является массивом, он представлен массивом, но связанным списком. Элементы из 'y' не копируются: задана только ссылка ... Некоторые переменные, таким образом, имеют одну и ту же субструктуру. –

+0

это будет зависеть от реализации, и, несомненно, есть люди, которые могут объяснить, по крайней мере, сторону GHC напрямую (а не я). Сказав это: я сомневаюсь, что любая реализация будет * копировать * 'y', а не просто повторно использовать его – Carsten

+1

Вот хороший пример (и, конечно же, вы его переопределили сами): https://en.wikipedia.org/wiki/Persistent_data_structure #Linked_lists – Carsten

ответ

4

Вы можете использовать StableName или reallyUnsafePointerEquality# (обратите внимание на имя и не использовать в реальных программах, вы будете также нуждаться MagicHash расширения назвать его), чтобы проверить, является ли два выражения относятся к одному объекту. См. What advantages do StableNames have over reallyUnsafePtrEquality#, and vice versa?.

+1

Существует очень мало пакетов, которые используют его для особых целей. На самом деле это не то, что новичок должен прикоснуться к десятифутовому полюсу, и я бы поставил на мороженое мороженое, которое менее 5% * опытных * программистов Haskell использовали его даже однажды. – dfeuer

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