2

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"

よろしく!

4

1 に答える 1

6

ここにいくつかの例があります:

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 APILanguage.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

MonadInterpreterIO には明らかにクラスのインスタンスがないため、エラーが発生します。IOGHCI のモナドはインタプリタ セッションに関する必要な情報を持っていないため、これは予期された動作です。によって適切なモナド型が設定されなければなりませんrunInterpreter

于 2012-12-08T08:36:32.263 に答える