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

Haskell 重新加载文件时自动将变量状态重新加载到GHCi中,haskell,emacs,read-eval-print-loop,ghci,Haskell,Emacs,Read Eval Print Loop,Ghci,当我在haskell中开发一些数据分析管道时,在加载时将变量状态预加载到GHCi中通常是有用的 我现在要做的是在emacs中逐行复制和粘贴脚本的一部分,只是为了测试和检查一些中间处理的输出。我甚至不能批量复制粘贴代码,因为换行符不会被传输(至少在emacs Interactive Haskell模式下) 有办法做到这一点吗 编辑:简单地加载/重新加载一个.hs文件并不能起到作用,因为很显然,没有办法让“有两种主要方法可以做到这一点: 使用:l[filename]GHCi命令在不退出GHCi的情

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

我现在要做的是在emacs中逐行复制和粘贴脚本的一部分,只是为了测试和检查一些中间处理的输出。我甚至不能批量复制粘贴代码,因为换行符不会被传输(至少在emacs Interactive Haskell模式下)

有办法做到这一点吗


编辑:简单地加载/重新加载一个.hs文件并不能起到作用,因为很显然,没有办法让“有两种主要方法可以做到这一点:

  • 使用
    :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)

我建议您看一看。它允许您通过数字引用变量,通过重新加载可以保持不变。下面是一个示例:

λ: :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"

为什么不把它做成一个函数/表达式并加载?或者把它打包成一个普通的模块,然后加载到ghci中?因为我想用ghci对函数中的变量进行交互式分析/测试。你能举个例子吗?我想我理解不正确-通常你可以把你使用的所有东西打包成一个.hs文件并加载这可能适用于纯代码——我可以有一个“伪脚本”,从do块中的等效代码中剥离“let”语句。我如何处理具有绑定的不纯净代码,例如“我不确定我是否理解您试图做的事情”。但是,您可以在GHCi中键入的任何内容,也可以放入当前目录中名为
.GHCi
的文件中,并且它将在您启动GHCi时自动运行。这对你有帮助吗?重新加载文件并不能奏效。我不能在顶层使用“
是的,我只是为了这个目的使用了
unsafePerformIO
。缺点是每次重新加载时必须重新计算变量;如果计算成本很高,那么外部存储方法可能会更好。@ReidBarton是的,您甚至可以将unsafePerformIO与外部存储结合起来:创建外部存储,执行昂贵的操作,并使用unsafePerformIO在文件中执行查找存储。
module Example where

import System.IO.Unsafe

example :: String 
example = "example"

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