解释是否用于eval haskell表达式?如果是的话,我该如何使用呢?
Language.Haskell.Interpreter> :t interpret
interpret :: (Data.Typeable.Internal.Typeable a, MonadInterpreter m) =>
String -> a -> m a
>interpret "1+1"
<interactive>:20:1:
Ambiguous type variable `m0' in the constraint:
(MonadInterpreter m0) arising from a use of `interpret'
Probable fix: add a type signature that fixes these type variable(s)
In the expression: interpret "1+1"
In an equation for `it': it = interpret "1+1"
问候!
答案 0 :(得分:5)
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
P.S。
Language.Haskell.Interpreter
的API不是非常用户友好。在不检查其示例文件的情况下,它的使用对我来说是一个难题(不是高级的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
必须在MonadInterpreter m
约束的monad中运行:
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
类的实例,因此出错。这是一种预期的行为,因为GHCI的IO
monad没有关于解释器会话的必需信息。必须通过runInterpreter
设置正确的monad类型。