2012-12-08 31 views
2

是否用於評估haskell表達式?如果是這樣,我該如何使用它?如何在Language.Haskell.Interpreter中使用解釋?

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" 

問候!

回答

5

some examples here

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. 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必須由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類,因此錯誤。這是一種預期的行爲,因爲GHCI的IO monad沒有關於解釋器會話的必需信息。一個合適的monad類型必須由runInterpreter設置。

+1

與這個例子我得到了同樣的錯誤沒有實例(MonadInterpreter m0)由於使用'interpret'引起的。 我使用ghc 7.6.1 – 0xAX

+0

@shk你需要告訴ghc(i)使用哪個monad。假設'IO'有一個'MonadInterpreter'實例,'interpret「head [True,False]」(as :: Bool):: IO Bool'應該可以工作。 –

+0

>解讀「head [True,False]」(as :: Bool):: IO Bool --reports:沒有用於(MonadInterpreter IO)的實例... –