我需要对现有的Haskell源文件进行一些更改,并写出修改后的源代码。我想为此使用GHC API,以便结果与当前的Haskell一致。我当前的方法在这里,类似于:
mod <- parseTheSource -- omitted, but I'm sure this works
printForUser dynFlags outHandle neverQualify $ ppr (transform mod)
Run Code Online (Sandbox Code Playgroud)
这行得通...差不多!它去除了LANGUAGE和OPTIONS_GHC编译指示,因此有时较早编译的文件在往返之后将失败。
有一个更好的方法吗?
我注意到这ghc-exactprint看起来很相关,但是我不知道如何使它正常工作。看起来它与GHC会话相关,该会话很可能DynFlags是从命令行初始化的,还有很多其他我不想要的垃圾。如果这是正确的方向,我可以使用一些帮助提炼出要做什么的方法,尤其是使用我自己DynFlags已经可以构造的方法,并且不会将GHC命令行处理等泄漏到代码中。
函数的定义(>>)如下:
(>>) :: Monad m => m a -> m b -> m b
但我想实现这个功能翻转如下:
我有一个函数tabulate :: Int -> [Int] -> IO Int,它将列表打印为具有给定列数的表格,并返回 monad 中所有列表项的总和IO。之后我想要一个明确的putStr "\n".
如果我会使用以下内容:
tabulate >> (putStr "\n")
它会丢弃制表的结果,相反,它不会在表格后打印换行符。如果在以下位置执行此操作do:
smth = do
let a = tabulate
putStr "\n"
a
Run Code Online (Sandbox Code Playgroud)
这样做将再次在表格之前打印换行符,因为 是a在putStr.
在制表函数之后如何打印换行符?