这里有一些例子:
interpret "head [True,False]" (as :: Bool)
interpret "head $ map show [True,False]" infer >>= flip interpret (as :: Bool)
其中“与解释一起使用以提供证人的便利功能”:
as :: Typeable a => a
infer :: Typeable a => a
PS API 的Language.Haskell.Interpreter
用户界面不是很友好。如果不检查它的示例文件,它的使用对我来说将是一个难题(不是高级 Haskeller)。
但是借助此处的示例,我们可以:
Prelude> import Language.Haskell.Interpreter as I
Prelude I> runInterpreter $ setImports ["Prelude"] >> interpret "map (*2) [1,2,3]" (as :: [Int])
Right [2,4,6]
有用的示例文件可以在~/.cabal/packages/hackage.haskell.org/hint/0.3.3.5/hint-0.3.3.5.tar.gz
.
看起来interpret
必须在受以下限制的 monad 中运行MonadInterpreter m
:
Prelude I> :t runInterpreter
runInterpreter
:: (Functor m, Control.Monad.CatchIO.MonadCatchIO m) =>
InterpreterT m a -> m (Either InterpreterError a)
Prelude I> :t interpret
interpret
:: (Data.Typeable.Internal.Typeable a, MonadInterpreter m) => String -> a -> m a
IO 显然没有MonadInterpreter
类的实例,因此出现错误。这是一种预期的行为,因为IO
GHCI 的 monad 没有关于解释器会话的必需信息。必须设置正确的 monad 类型runInterpreter
。