小编Chr*_*ith的帖子

如何编写代码以修改Haskell源文件的AST而又不会丢失编译指示?

我需要对现有的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命令行处理等泄漏到代码中。

haskell ghc ghc-api

6
推荐指数
0
解决办法
45
查看次数

Monadic 组合并翻转丢弃 (&gt;&gt;)

函数的定义(>>)如下:

(>>) :: 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)

这样做将再次在表格之前打印换行符,因为 是aputStr.

在制表函数之后如何打印换行符?

monads haskell

6
推荐指数
1
解决办法
175
查看次数

标签 统计

haskell ×2

ghc ×1

ghc-api ×1

monads ×1