当我在Haskell中开发一些数据分析流水线时,预加载变量状态到GHCi中常常是很有用的。目前我所做的是逐行地将脚本复制并粘贴到emacs中,以测试和检查某些中间处理的输出。我甚至无法批量复制粘贴代码,因为换行符不会被传输(至少在emacs Interactive-Haskell模式中是这样)。有没有什么办法可以解决这个问题呢?注意:仅仅加载/重新加载.hs文件并不能解决问题,因为据我所知,在顶层没有"<-"绑定的方法。
我建议您查看 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"
unsafePerformIO
。缺点是每次重新加载都必须重新计算变量;如果计算过程相当昂贵,则外部存储方法可能更好。 - Reid Barton有两种主要方法可以做到这一点:
:l [文件名]
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)
<-
会起作用。例如,您可以在ghci中键入str <- getLine
,然后它将运行getLine
并将您键入的任何内容绑定到str
。 - Jeremy List
.ghci
的文件中,该文件位于当前目录中,每次启动 GHCi 时都会自动运行。这对你有帮助吗? - mhwombat