我對自然語言的一個小玩具的語義,用類似的話:Language.Haskell.Interpreter:這是手頭工作的正確工具嗎?
ran :: String -> Bool
ran = (`elem` ["Bart", "Homer", "Marge"])
和:
bart :: String
bart = "Bart"
因此,例如,我可以有(ran bart) :: Bool
,等等。
我想寫一個解析器,例如採用字符串"Bart ran"
並返回True
。我可能會使用Parsec。
但是,問題是能夠通過字符串調用函數。例如。從"ran"
獲得功能ran
。爲此,我認爲Language.Haskell.Interpreter
的interpret
功能可能是適當的。
所以我的問題是:
這是一個明智的方式做我想做的事?
如果是這樣,爲什麼不下面的工作,進入GHCI,在同一個目錄中
ran
給出了一個名爲Grammar.hs
模塊定義如上:let a = runInterpreter $ do loadModules ["Grammar"] setImports ["Prelude"] interpret "ran" (as :: String -> Bool) let b = do x <- a return $ x <*> pure "John" b
我得到的錯誤:
"Left (WontCompile [GhcError {errMsg = "<interactive>:2:1:\n Not in scope: \8216ran\8217\n Perhaps you meant \8216tan\8217 (imported from Prelude)"}])"
這表明導入不起作用,事實上,如果我嘗試類似Prelude函數,一切正常。
- 爲什麼我獲得下列類型的錯誤(以及許多其他),如果我嘗試編譯相同的代碼在第二季度,(減去
let
):
No instance for
MonadIO m0
arising from a use ofrunInterpreter