如何获取 Haskell 代码的字符串(以及值)

How can I get the string of Haskell code (along with the value)

我想获取任意 Haskell 代码的字符串和值。例如:

f (1+1) -> (2,"1+1")

我想这样做的原因是因为我正在编写一种编程语言,我想提供一个选项来解释代码(为了快速 运行,即脚本)或将其编译为Haskell 代码(高效的运行时)。所以对于每个内置函数,我只想提供一次实现。那是我不想说的

plusop = ((+),"(+)")

我有一些想法涉及阅读原始 haskell 源代码或生成编译器的单独脚本,但这些似乎不如这个问题可能时所做的那样优雅。

看起来 QuasiQuotation 可以使这成为可能,但如果我使用它,我不知道如何获取表达式的 Haskell 值(我只能获取字符串)。

可能吗?怎么做到的?

我不知道你到底想做什么,但这里有一个使用模板 Haskell 来做类似于你的例子的例子:

-- TH.hs
{-# LANGUAGE TemplateHaskell #-}
module TH where

import Language.Haskell.TH.Syntax
import Language.Haskell.TH.Ppr

showAndRun :: Q Exp -> Q Exp
showAndRun m = do
  x <- m
  let s = pprint x
  [| ($m, s) |]
-- Main.hs
{-# LANGUAGE TemplateHaskell #-}
import TH

main :: IO ()
main = print $(showAndRun [| 1 + 1 |])
$ runhaskell Main.hs
(2,"1 GHC.Num.+ 1")

我不知道如何漂亮地打印没有限定 GHC.Num 前缀的表达式。您可以尝试复制 Language.Haskell.TH.Ppr 的实现并在必要的地方进行更改。或者最简单的可能只是一个 post 处理步骤,在该步骤中,您去除每个以大写字母开头并以 ..

结尾的单词