gpt4 book ai didi

haskell - 是否有一个(模板)Haskell 库可以让我打印/转储一些具有各自名称的本地绑定(bind)?

转载 作者:行者123 更新时间:2023-12-04 03:50:38 26 4
gpt4 key购买 nike

例如:

let x = 1 in putStrLn [dump|x, x+1|]

会打印类似的东西
x=1, (x+1)=2

即使目前没有这样的东西,是否有可能写出类似的东西?

最佳答案

我现在几乎已经解决了这个问题。不完全是你想象的,但相当接近。也许其他人可以将此作为更好版本的基础。无论哪种方式,与

{-# LANGUAGE TemplateHaskell, LambdaCase #-}

import Language.Haskell.TH

dump :: ExpQ -> ExpQ
dump tuple =
listE . map dumpExpr . getElems =<< tuple
where
getElems = \case { TupE xs -> xs; _ -> error "not a tuple in splice!" }
dumpExpr exp = [| $(litE (stringL (pprint exp))) ++ " = " ++ show $(return exp)|]

你有能力做类似的事情
λ> let x = True
λ> print $(dump [|(not x, x, x == True)|])
["GHC.Classes.not x_1627412787 = False","x_1627412787 = True","x_1627412787 GHC.Classes.== GHC.Types.True = True"]

这几乎是你想要的。如您所见, pprint 是一个问题。函数包括模块前缀等,这使得结果......不太理想的可读性。我还不知道有什么解决方法,但除此之外我认为它是相当有用的。

它在语法上有点重,但那是因为它使用常规 [| Haskell 中的引号语法。如果有人想按照您的建议编写自己的准引用器,我很确定还必须重新实现解析 Haskell,这会有点糟糕。

关于haskell - 是否有一个(模板)Haskell 库可以让我打印/转储一些具有各自名称的本地绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31349556/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com