Диапазон символов Юникода GHC принимает

Это может показаться немного смешным, но GHC не скомпилирует мою строку, содержащую бекон, круассан, огурец и картофель:

main = putStrLn "🥓  🥐  🥒  🥔"

Я понимаю, что я мог легко написать

main = putStrLn "\x1F953  \x1F950  \x1F952  \x1F954"

к тому же эффекту, но я всегда предполагал, что GHC примет любой юникод в своем источнике. Итак: каковы фактические ограничения на символы Unicode, которые GHC принимает в исходных файлах?


BTW: Я понимаю, что поддержка такого рода ада для GHC lexer (на самом деле я столкнулся с вышеупомянутой проблемой при написании тестовых примеров для lexer, которые я написал), но я все еще немного разочарован.

Ответы

Ответ 1

Сохраняя main = putStrLn "🥓 🥐 🥒 🥔" как UTF-8 и запуская его с ghc 8.0.1 на macOS, я получил:

lexical error in string/character literal at character '\129365'

Я нашел этот связанный (но закрытый) отчет об ошибке ghc:

Причиной (для обеих проблем) было то, что более старые версии GHC поддерживают более старую версию Unicode:

$ ghc-7.0.3 -e "Data.Char.generalCategory '\8342'"
NotAssigned

Таким образом, проблема заключается в том, что версия ghc, которую мы используем, еще не поддерживает новую эмуляцию - она ​​считает, что кодовая точка unicode не назначена и ошибки, даже если она назначена emoji в более новых версиях unicode.

Связанный открытый пробег ghc, который в основном обсуждает, какие символы пробелов разрешены, хотя.

Наконец, функция lit_error в Lexer.x кажется, где ошибка всплывает. В этом файле есть несколько функций, которые вызывают эту ошибку, поэтому не уверены, откуда она происходит...