当我在haskell中开发一些数据分析管道时,在加载时将变量状态预加载到GHCi中通常会很有用。
我现在最终要做的是在emacs中逐行复制和粘贴脚本的一部分,以测试和检查某些中间处理的输出。我甚至无法批量复制粘贴代码,因为换行不会被转移(至少在emacs Interactive-Haskell模式下)
有办法做到这一点吗?
编辑:简单地加载/重新加载.hs文件并不能解决问题,因为afaik没有办法让"< - "最高级别的绑定。答案 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)