У меня есть исходный файл Haskell, в котором используется синтаксис Unicode:

{-# LANGUAGE UnicodeSyntax #-}
succ' :: Int → Int
succ' = succ

main :: IO ()
main = print $ succ' 1

Это анализирует и отлично работает с GHC. Кроме того, стильные-haskell и hlint (оба основаны на haskell-src-exts) могут без проблем читать этот файл. Однако когда я пытаюсь разобрать его сам с помощью haskell-src-exts:

import Language.Haskell.Exts (parseModule)

main = do
    x <- readFile "test.hs"
    print $ parseModule x

Я получаю сообщение об ошибке:

ParseFailed (SrcLoc {srcFilename = "<unknown>.hs", srcLine = 6, srcColumn = 1}) "TypeOperators is not enabled"

Однако явное предоставление UnicodeSyntax в списке расширений или использование parseFile работает нормально:

import Language.Haskell.Exts

main = do
    x <- readFile "test.hs"
    print $ parseModuleWithMode defaultParseMode
        { extensions = [UnicodeSyntax]
        } x

    parseFile "test.hs" >>= print

Есть идеи, почему первый подход терпит неудачу?

11
Michael Snoyman 3 Апр 2013 в 13:49
2
При беглом взгляде на исходный код не похоже, что parseModule извлекает языковые прагмы из источника перед синтаксическим анализом (parseFile делает это, вызывая getExtensions ). К моменту начала синтаксического анализа уже слишком поздно включать синтаксис Unicode.
 – 
Anupam Jain
3 Апр 2013 в 14:46
Вы правы, спасибо! Похоже, что parseFileContents - подходящая функция для моего варианта использования. Если вы конвертируете свой комментарий в ответ, я отмечу его как правильный ответ.
 – 
Michael Snoyman
3 Апр 2013 в 15:18
Выполнено! Я не был абсолютно уверен, что это было причиной, но если подумать, определенно кажется, что это так.
 – 
Anupam Jain
3 Апр 2013 в 16:38

1 ответ

Лучший ответ

При беглом взгляде на исходный код не похоже, что parseModule извлекает языковые прагмы из источника перед синтаксическим анализом (parseFile делает это, вызывая getExtensions). К моменту начала синтаксического анализа уже слишком поздно включать синтаксис Unicode.

6
Anupam Jain 3 Апр 2013 в 16:36