Существует полный анализатор Haskell: http://hackage.haskell.org/package/haskell-src-exts
После того, как вы его проанализировали, легко удалить или запретить некоторые вещи. Я сделал это для tryhaskell.org, чтобы запретить операторы импорта, поддерживать определения верхнего уровня и т. Д.
Просто разобрать модуль:
parseModule :: String -> ParseResult Module
Тогда у вас есть AST для модуля:
Module SrcLoc ModuleName [ModulePragma] (Maybe WarningText) (Maybe [ExportSpec]) [ImportDecl] [Decl]
Обширный тип Decl: http://hackage.haskell.org/packages/archive/haskell-src-exts/1.9.0/doc/html/Language-Haskell-Exts-Syntax.html#t%3ADecl
Все, что вам нужно сделать, это определить белый список - какие объявления, импорт, символы, синтаксис доступны, затем пройти AST и выдать «ошибку разбора» на все, что вы не хотите, чтобы они знали пока что. Вы можете использовать значение SrcLoc, прикрепленное к каждому узлу в AST:
data SrcLoc = SrcLoc
{ srcFilename :: String
, srcLine :: Int
, srcColumn :: Int
}
Нет необходимости повторно реализовывать Haskell. Если вы хотите предоставить более дружественные ошибки компиляции, просто проанализируйте код, отфильтруйте его, отправьте его компилятору и проанализируйте выходные данные компилятора. Если это «не удалось сопоставить ожидаемый тип a с логическим выводом a -> b
», то вы знаете, что для функции, вероятно, слишком мало аргументов.
Если вы действительно не хотите тратить время на реализацию Haskell с нуля или возиться с внутренностями Hugs или какой-то глупой реализацией, я думаю, вам следует просто отфильтровать то, что передается GHC. Таким образом, если ваши ученики захотят взять свою кодовую базу и перейти к следующему шагу и написать какой-то действительно полноценный код на Haskell, переход будет прозрачным.