重新加载文件时自动将变量状态重新加载到GHCi中

时间:2015-04-20 15:50:08

标签: haskell emacs read-eval-print-loop ghci

当我在haskell中开发一些数据分析管道时,在加载时将变量状态预加载到GHCi中通常会很有用。

我现在最终要做的是在emacs中逐行复制和粘贴脚本的一部分,以测试和检查某些中间处理的输出。我甚至无法批量复制粘贴代码,因为换行不会被转移(至少在emacs Interactive-Haskell模式下)

有办法做到这一点吗?

编辑:简单地加载/重新加载.hs文件并不能解决问题,因为afaik没有办法让"< - "最高级别的绑定。

2 个答案:

答案 0 :(得分:3)

我建议你看看foreign-store。它允许您通过数字引用变量,这些变量在重新加载时仍然存在。这是一个例子:

λ: :set -XScopedTypeVariables 
λ: import Foreign.Store
λ: st <- newStore "example"
Loading package foreign-store-0.2 ... linking ... done.
λ: readStore st
"example"
λ: st
Store 0
λ: :r
Ok, modules loaded: none.
λ: st
<interactive>:8:1:
    Not in scope: ‘st’
    Perhaps you meant ‘fst’ (imported from Prelude)
λ: Just (st :: Store String) <- lookupStore 0
λ: readStore st
"example"

或者,您也可以将所有定义放在单个hs文件中,只重新加载。您可以使用unsafePerformIO来解决您无法在顶层使用<-的限制。我认为在这种情况下没问题,因为你只是用它来进行交互:

module Example where

import System.IO.Unsafe

example :: String 
example = "example"

file :: String
file = unsafePerformIO $ readFile "/tmp/example.hs"

答案 1 :(得分:0)

有两种主要方法可以做到这一点:

  • 使用:l [filename] GHCi命令重新加载文件而不退出GHCi。
  • 将变量写入~/.ghci文件中,该文件将在GHCi打开时加载。

如果您不知道要放入~/.ghci的内容,这就是我的内容:

:set prompt "\955 "
:set prompt2 "| "

:def hoogle \x -> return $ ":!hoogle --info \"" ++ x ++ "\""

let f `on` x = \a b -> (f a) `x` (f b)
let break (f,g) = \a -> (f a, f g)