Как я могу сохранить среду между перезагрузками GHCi? - PullRequest
9 голосов
/ 15 сентября 2011

В основном, когда я :load name.hs, переменные и привязки исчезают.

Есть ли какой-нибудь вариант, чтобы ghci оставил все это?

Ответы [ 3 ]

4 голосов
/ 15 сентября 2011

Для загрузки нового модуля вы можете использовать

Prelude> :m + Mymodule

Но перезагрузка и сохранение интерактивных привязок обычно невозможны. Перезагрузка по существу забывает все модули и загружает их снова Привязки могут зависеть от уже загруженных модулей. Логика зависимости диктует, что, когда GHCI забывает модуль, ему также необходимо забыть все, что от него зависит, включая интерактивные привязки.

GHCI может, например, сохраните текст команд, которые использовались для создания привязок, и попробуйте повторно запустить эти команды при перезагрузке, зная, что некоторые из них могут потерпеть неудачу. Но это может очень быстро стать волосатым, поэтому это не делается.

4 голосов
/ 15 апреля 2016

Я добавляю еще один ответ, так как этот вопрос впервые был для меня хитом Google, в то время как реальное решение было далеко (и я просто не проверял остальные хиты, и только из-за полезных людей в IRC, которых я нашелit):

http://chrisdone.com/posts/ghci-reload

По сути, это библиотека, которая позволяет хранить ваши данные под стабильным указателем с некоторым кодом C, который выживает после перезагрузок GHCi.

Пример, приведенный в этом посте, довольно сложный, для кого-то, кто просто хочет, чтобы в сеансе GHCi были готовы данные, лучше прочитать README из самой библиотеки:

https://github.com/chrisdone/foreign-store/blob/master/README.md

Это спасло меняМного времени, но мой сценарий был тривиальным: я хотел, чтобы некоторые ресурсы были загружены и готовы, пока я манипулировал остальной частью кода.Типы и структура этих активов не меняются вообще.

2 голосов
/ 15 сентября 2011

Я не думаю, что это можно сделать с помощью GHCi.

Гугл, я нашел файл readme , в котором говорится, что: перезагрузка поддерживаемых переменных, но сохранение привязок не работает для меня:

*Main> let x = 1
*Main> :show bindings
x :: forall t. (Num t) => t = _
*Main> x
1
*Main> :reload
Ok, modules loaded: Main.
*Main> :show bindings

*Main> x

<interactive>:1:0: Not in scope: `x'
...