Ошибка компиляции Debug GHC, возвращенная во время выполнения подсказкой `Language.Haskell.Interpreter.runInterpreter`

я повторно опубликовал этот вопрос, чтобы лучше сосредоточиться на конкретной ошибке и лучше перечислить, что я уже пробовал.

Я пытаюсь разобрать код на 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\"" не меняет сообщение об ошибке.


person ShapeOfMatter    schedule 22.12.2019    source источник
comment
Можете ли вы показать нам программу, которую вы пытаетесь запустить с помощью Hint? Возможно, ошибка именно там, а не в вашей основной программе.   -  person bradrn    schedule 23.12.2019
comment
@bradrn: отредактировано, чтобы включить два упомянутых файла.   -  person ShapeOfMatter    schedule 23.12.2019
comment
Я должен пояснить, что представленный код должен быть доказательством концепции для другого вопроса, который я пытаюсь решить в связи с Polysemey.   -  person ShapeOfMatter    schedule 23.12.2019
comment
Вы проверили, что UserProvided.hs компилируется самостоятельно? Подсказка может просто сообщать об ошибке компиляции.   -  person bradrn    schedule 23.12.2019
comment
UserProvided.hs не является правильной программой или модулем; это фрагмент, который должен представлять значение типа MyEffect. Так что я не могу его скомпилировать, но я могу скопировать и вставить его в GHCi с загруженными эффектами, и это работает. Я даже могу запустить его, если я также импортирую Polysemy!   -  person ShapeOfMatter    schedule 23.12.2019
comment
Я знаю это. Мне вот что интересно: если вы поместите этот фрагмент в отдельный модуль и импортируете необходимые модули, компилируется ли он?   -  person bradrn    schedule 24.12.2019
comment
Я понимаю. Да: если я встрою его в Main, заключу в круглые скобки и отступу с явным объявлением типа как E.MyEffect, он будет работать, как и ожидалось.   -  person ShapeOfMatter    schedule 24.12.2019
comment
Спасибо @ShapeOfMatter! Тогда это не может быть проблемой. Я внимательно рассмотрю код и посмотрю, смогу ли я что-нибудь заметить.   -  person bradrn    schedule 24.12.2019
comment
Я только что обнаружил кое-что очень интересное: достаточно просто выполнить H.interpret "pure ()" (H.as :: Sem '[Embed IO] ()), чтобы вызвать ошибку! Но я до сих пор не знаю, что означает эта ошибка и как ее исправить…   -  person bradrn    schedule 24.12.2019