[英]How can I find out which functions can be run on an expression?
我想以编程方式找出模块中的哪些功能可能适用于特定表达式。
让我们具体化。
{-# LANGUAGE TemplateHaskell #-}
module Test where
-- we'll import template-haskell from Lens
-- so we can create prisms automatically for our 'AST'
import qualified Control.Lens.TH as LTH
--- some 'AST' in a toy language
data CExp
= CLit Int -- a literal integer
| CAdd CExp CExp -- addition
| CMul CExp CExp -- multiplication
| CSub CExp CExp -- subtraction
deriving Show
-- an eval for our AST
eval :: CExp -> Int
eval exp =
case exp of
CLit i -> i
CAdd e1 e2 ->
eval e1 + eval e2
CMul e1 e2 ->
eval e1 * eval e2
CSub e1 e2 ->
eval e1 - eval e2
-- a function to build a sum using add with our AST, from a list of Int values
listToSums :: [Int] -> CExp
listToSums =
foldr CAdd (CLit 0) . fmap CLit
-- here we make prisms for looking at particular values
-- in the CExp AST
LTH.makePrisms ''CExp
-- let's have an expression:
theList1 :: CExp
theList1 = listToSums [1..38]
现在,在这一点上,我想要一个函数,该函数可以列出特定模块(包括该模块)的所有顶级功能,这些功能可以应用于表达式theList1
。 这将包括使用makePrisms
创建的棱镜。
如果它使用提示库的Interpreter
monad,那会很好。 我已经进行了一些试验,虽然可以在任何模块的顶层获得所有定义的列表,并且也可以(或多或少)找到它们的类型,但我还是关于如何将表达式作为这些函数的参数传递进去,然后检查这些表达式是否将进行类型检查,这一点点丢失了。
如果可以的话,我可以对模块中的所有功能运行过滤器,从而找出适用的功能。
提前谢谢了。
提示具有一个名为typeChecks :: MonadInterpreter m => String -> m Bool
的函数,该函数告诉您字符串的表达式是否在解释器的上下文中正确键入。
fnsAccepting :: MonadInterpreter m => String -> m [Id]
fnsAccepting expr = do
moduleContents <- getLoadedModules >>= traverse getModuleExports
let importedFns = [fn | exports <- moduleContents, Fun fn <- exports]
filterM (\fn -> typeChecks $ fn ++ " " ++ parens expr) importedFns
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.