я повторно опубликовал этот вопрос, чтобы лучше сосредоточиться на конкретной ошибке и лучше перечислить, что я уже пробовал.
Я пытаюсь разобрать код на Haskell во время выполнения программы на Haskell, используя пакет подсказок а>.
Внешняя программа компилируется, но когда я запускаю ее, происходит сбой внутренней компиляции. Я получаю описание того, что, как я предполагаю, является проблемой синтаксиса и расположением в интерактивном коде, но я понятия не имею, как просмотреть рассматриваемый код.
Вот Main.hs
module Main where
import Data.List (intercalate)
import Polysemy (runM)
import qualified Language.Haskell.Interpreter as H
import qualified Effects as E
handleFailures :: Either H.InterpreterError a -> IO a
handleFailures (Left l) = ioError $ userError $ message l
where
message (H.WontCompile es) = intercalate "\n" (header : map unbox es)
message e = show e
header = "ERROR: Won't compile:"
unbox (H.GhcError e) = e
handleFailures (Right a) = return a
interpretation :: String -> H.Interpreter E.MyEffect
interpretation s = do
H.loadModules ["Effects"]
H.setImportsQ [("Prelude", Nothing), ("Effects", Nothing)]
effect <- H.interpret s (H.as :: E.MyEffect)
return effect
extractProgram :: String -> IO E.MyEffect
extractProgram s = do
p <- H.runInterpreter $ interpretation s
success <- handleFailures p
return success
main :: IO ()
main = do
userProvided <- readFile "UserProvided.hs"
userProgram <- extractProgram userProvided
runM . E.teletypeToIO . E.teletypePlusToIO $ userProgram
Effects.hs определяет и предоставляет помощники для монады Polysemey Sem
с именем MyEffect
.
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE LambdaCase, BlockArguments #-}
{-# LANGUAGE GADTs, FlexibleContexts, TypeOperators, DataKinds, PolyKinds, ScopedTypeVariables #-}
module Effects where
import Polysemy
data Teletype m a where
ReadTTY :: Teletype m String
WriteTTY :: String -> Teletype m ()
makeSem ''Teletype
teletypeToIO :: Member (Embed IO) r => Sem (Teletype ': r) a -> Sem r a
teletypeToIO = interpret $ \case
ReadTTY -> embed getLine
WriteTTY msg -> embed $ putStrLn msg
data TeletypePlus m a where
ReadPlus :: TeletypePlus m String
WritePlus :: String -> TeletypePlus m ()
makeSem ''TeletypePlus
teletypePlusToIO :: Member (Embed IO) r => Sem (TeletypePlus ': r) a -> Sem r a
teletypePlusToIO = interpret $ \case
ReadPlus -> embed $ ("+" <>) <$> getLine
WritePlus msg -> embed $ putStrLn $ msg <> "+"
type MyEffect = Sem [TeletypePlus, Teletype, Embed IO] ()
UserProvided.hs содержит простое выражение do
в MyEffect
.
do
i <- readTTY
j <- readPlus
let k = i <> j
writeTTY k
writePlus k
Чтобы пакет полисемии был доступен во время выполнения, мне нужно запустить его из изолированной программной среды клики.
$ cabal build
Build profile: -w ghc-8.8.1 -O1
In order, the following will be built (use -v for more details):
- Hello-Polysemy-0.1.0.0 (exe:Hello-Polysemy) (file Main.hs changed)
Preprocessing executable 'Hello-Polysemy' for Hello-Polysemy-0.1.0.0..
Building executable 'Hello-Polysemy' for Hello-Polysemy-0.1.0.0..
[2 of 2] Compiling Main ( Main.hs, /home/mako/Git/Hello-Polysemy/dist-newstyle/buil/x86_64-linux/ghc-8.8.1/Hello-Polysemy-0.1.0.0/x/Hello-Polysemy/build/Hello-Polysemy/Hello-Polysemy-tmp/Main.o )
Linking /home/mako/Git/Hello-Polysemy/dist-newstyle/build/x86_64-linux/ghc-8.8.1/Hello-Polysemy-0.1.0.0/x/Hello-Polysemy/build/Hello-Polysemy/Hello-Polysemy ...
$ cabal exec bash
... но потом ...
$ cabal run
Up to date
Hello-Polysemy: user error (ERROR: Won't compile:
<interactive>:10:135: error:
Operator applied to too few arguments: :)
Насколько я могу судить, единственное место, где я использую оператор :
, находится в Effects.hs, где (а) я на самом деле использую оператор типа ':
и (б) компиляция завершается успешно просто отлично, когда эффекты импортированы в Main.hs.
Любые предложения о том, в чем может быть проблема, или как я могу узнать больше?
Я уже пытался использовать Language.Haskell.Interpreter.Unsafe.unsafeRunInterpreterWithArgs ["-v4"]
. Это поясняет, что речь идет о ghc-prim:GHC.Types.:{(w) d 66})
, но я не знаю, что делать с этой информацией.
Обновлять:
Я пробовал различные варианты встраивания кода userProvided.
Объявление того же самого значения Effect
, встроенного в Main, работает нормально. Замена строки, считанной из файла, встроенной строкой с еще более простым значением "writePlus \"asdf\""
не меняет сообщение об ошибке.
UserProvided.hs
компилируется самостоятельно? Подсказка может просто сообщать об ошибке компиляции. - person bradrn   schedule 23.12.2019MyEffect
. Так что я не могу его скомпилировать, но я могу скопировать и вставить его в GHCi с загруженными эффектами, и это работает. Я даже могу запустить его, если я также импортирую Polysemy! - person ShapeOfMatter   schedule 23.12.2019E.MyEffect
, он будет работать, как и ожидалось. - person ShapeOfMatter   schedule 24.12.2019H.interpret "pure ()" (H.as :: Sem '[Embed IO] ())
, чтобы вызвать ошибку! Но я до сих пор не знаю, что означает эта ошибка и как ее исправить… - person bradrn   schedule 24.12.2019