gpt4 book ai didi

haskell - 有没有办法使用 Template Haskell 枚举模块中的所有函数?

转载 作者:行者123 更新时间:2023-12-04 15:23:04 25 4
gpt4 key购买 nike

虽然我可以使用 reify 要获取有关大多数其他句法结构的信息,我找不到任何可以提供有关模块的信息的东西。

最佳答案

不幸的是,Haskell 模板目前没有这样的能力。所有解决方案都涉及解析模块的源代码。然而 locationloc_filename TH 的功能可以很容易地找到带有调用接头的模块。

这是从 the source code 中提取的解决方案我的一个项目:

{-# LANGUAGE LambdaCase, TupleSections #-}
import Language.Haskell.TH
import qualified Data.Attoparsec.Text as AP
import qualified Data.Text.IO as Text
import qualified Data.Text as Text
import qualified Data.Char as Char
import Data.Maybe
import Data.List
import Control.Applicative
import Data.Traversable
import Prelude hiding (mapM)


reifyLocalFunctions :: Q [(Name, Type)]
reifyLocalFunctions =
listTopLevelFunctionLikeNames >>=
mapM (\name -> reifyFunction name >>= mapM (return . (name, ))) >>=
return . catMaybes
where
listTopLevelFunctionLikeNames = do
loc <- location
text <- runIO $ Text.readFile $ loc_filename loc
return $ map (mkName . Text.unpack) $ nub $ parse text
where
parse text =
either (error . ("Local function name parsing failure: " ++)) id $
AP.parseOnly parser text
where
parser =
AP.sepBy (optional topLevelFunctionP <* AP.skipWhile (not . AP.isEndOfLine))
AP.endOfLine >>=
return . catMaybes
where
topLevelFunctionP = do
head <- AP.satisfy Char.isLower
tail <- many (AP.satisfy (\c -> Char.isAlphaNum c || c `elem` ['_', '\'']))
return $ Text.pack $ head : tail

reifyFunction :: Name -> Q (Maybe Type)
reifyFunction name = do
tryToReify name >>= \case
Just (VarI _ t _ _) -> return $ Just $ t
_ -> return Nothing

tryToReify :: Name -> Q (Maybe Info)
tryToReify n = recover (return Nothing) (fmap Just $ reify n)

关于haskell - 有没有办法使用 Template Haskell 枚举模块中的所有函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20606257/

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