10

基本的に:load name.hs、変数とバインディングがなくなったとき。

ghciにすべてを保持するように指示するオプションはありますか?

4

3 に答える 3

4

この質問は私にとって最初のグーグルヒットだったので、さらに別の回答を追加していますが、実際の解決策はさらに先にありました(残りのヒットをチェックしていなかっただけで、IRCの親切な人々のおかげで見つけました):

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

基本的には、GHCi のリロードに耐える C コードを下に置いて、安定したポインタの下にデータを保持できるようにするライブラリです。

そのブログ投稿に示されている例はかなり複雑です。GHCi セッションでデータを準備したいだけの人にとっては、ライブラリ自体の README の方が優れています。

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

これにより多くの時間を節約できましたが、私のシナリオは些細なものでした。残りのコードを操作している間に、いくつかのアセットをロードして準備を整えておきたかったのです。これらのアセットのタイプと構造はまったく変更されていません。

于 2016-04-15T10:33:29.963 に答える
4

新しいモジュールをロードするには、次を使用できます

Prelude> :m + Mymodule

ただし、インタラクティブなバインディングを再読み込みして保持することは、通常は不可能です。リロードとは、基本的にすべてのモジュールを忘れて、再度ロードすることです。バインディングは、すでにロードされているモジュールに依存する可能性があります。依存関係のロジックは、GHCI がモジュールを忘れた場合、対話型バインディングを含む、それに依存するすべてのものも忘れる必要があることを示しています。

GHCI は、たとえば、バインドの作成に使用されたコマンドのテキストを保存し、それらのコマンドの一部が失敗する可能性があることを認識して、リロード時にそれらのコマンドを再実行しようとすることができます。しかし、これはすぐに毛羽立ってしまう可能性があるため、行われていません。

于 2011-09-15T10:59:33.167 に答える
2

これはGHCiではできないと思います。

グーグル、私は:reload が変数を維持することを述べている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'
于 2011-09-15T09:09:00.767 に答える