繁体   English   中英

我如何找出可以在表达式上运行的函数?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM