暗示
![生成状态](https://github.com/haskell-hint/hint/workflows/CI/badge.svg)
这个库定义了一个解释器monad,您可以在其中进行解释字符串,如"[1,2] ++ [3]"
转换为如下值[1,2,3]
。你可以很容易地在编译程序和解释程序之间交换数据,如只要数据具有可输入
实例。
在评估这些模块时,您可以选择哪些模块应在范围内表达式,您可以浏览这些模块的内容,并且可以请求您正在浏览的标识符的类型。
例子
{-#LANGUAGE LambdaCase,ScopedTypeVariables,TypeApplications#-}进口管制。异常(throwIO)进口管制。Monad(何时)进口管制。莫纳德。事务处理。等级(电梯)进口管制。莫纳德。变速器。编写器(execWriterT,tell)导入数据。可折叠(用于_)导入数据。列表(isPrefixOf)导入数据。可打字(可打字)导入限定语言。哈斯克尔。口译员作为提示-- |--将表达式解释为值:---->>>eval@[Int]“[1,2]++[3]”--右[1,2,3]----通过以下方式将值从编译程序发送到解释程序--解释函数:---->>>右f<-eval@(Int->[Int])“\\x->[1..x]”-->>>第5页-- [1,2,3,4,5]eval::针对所有t。可键入t=>字符串->IO(任一提示。解释器错误t)eval s=提示runInterpreter$do提示setImports[“序曲”]提示解释(提示为::t)-- |-- >>> :{--做正确的内容<-浏览“前奏曲”--对于内容$\(标识符,tp)->do--when(“put”`isPrefixOf`标识符)$do--putStrLn$identifier++“::”++tp-- :}--putChar::Char->IO()--putStr::字符串->IO()--putStrLn::字符串->IO()浏览::提示。ModuleName->IO(任一提示解释器错误[(String,String)])浏览模块名称=提示runInterpreter$doHint.setImports[“序曲”,“Data.Typeable”,模块名称]exports<-Hind.getModuleExports模块名称execWriterT$do出口$\case提示。趣味标识符->dotp<-lift$Hint.typeOf标识符告诉[(标识符,tp)]_->pure()--跳过数据类型和类型类
检查示例.hs对于较长的示例(必须运行来自hint的基本目录)。
限制
不支持从当前包导入模块。它可能看起来就像它在前一天起作用,第二天就开始了。你已经被警告过了。
要解决此限制,请将这些模块移动到单独的包中。现在调用hint的代码部分和hint解释的代码可以两者都导入该模块。
无法交换值其类型包含隐式类型参数.这包括类型级列表。为了绕过这个限制,定义一个包装您的类型的newtype包装器希望.
可以在线程内运行解释器,但在GHC 8.8和下面,您不能同时运行解释器的两个实例。
GHC必须安装在编译的可执行文件所在的系统上正在运行。对此有一个变通办法,但是这不是小事.
解释代码使用的包必须安装在包中数据库,需要在运行时告知有关包数据库的提示。
包数据库最常见的用例是将解释的代码可以访问与编译代码相同的包(但不能访问编译代码自身)。实现这一点最简单的方法是通过GHC环境文件,生成GHC环境文件的最简单方法是通过阴谋集团.使用编译代码cabal build--write-ghc-environment-files=始终
;这将创建一个名为.ghc.环境<某事>
在电流中目录。在运行时,hint将在当前目录中查找该文件。
对于更高级的用例,您可以使用不安全运行带参数的解释器
将参数传递给底层ghc库,例如-数据包-db
指定包数据库的路径,或-软件包环境
指定GHC环境文件的路径。