Использование Emoji в Haskell
Недавно я наткнулся на бот в Twitter под названием EmojiHaskell, который утверждает, что чирикает "интерпретируемый код Haskell с именами переменных emoji". Особый Tweet привлек мое внимание, поскольку это выглядело как неправильный синтаксис для меня, поэтому я решил поближе рассмотреть. До сих пор я выпустил следующий код:
module Main where
🙏 :: [🍳] -> Maybe 🍳
🙏 [] = Nothing
🙏 (👽:as) = Just 👽
main = print $ 🙏 "♥"
Поскольку я использовал λ
иногда в моем коде Haskell, я ожидал, что этот код будет работать, но похоже, что GHC вообще не нравится emoji.
С $ runhaskell Main.hs
я получаю:
Main.hs: 4: 1: ошибка синтаксического анализа на входе '🙏
Я уже рассмотрел расширение UnicodeSyntax,
и пытались использовать только некоторые или отдельные эможи, а не все, чтобы увидеть, вызвал ли какой-то вопрос проблему.
Теперь мой вопрос таков:
Есть ли в настоящее время компилятор Haskell, который бы принял код?
Могу ли я заставить GHC работать с этим кодом каким-то образом?
Ответы
Ответ 1
Этот код недействителен haskell. Причина в том, что 🙏 (как, вероятно, все Emojis) является символьным символом:
Prelude> import Data.Char
Prelude Data.Char> generalCategory '🙏'
OtherSymbol
Но вы все равно можете использовать их как любой другой символ, а именно как оператор:
Prelude Data.Char> let (🙏) = (+)
Prelude Data.Char> 32 🙏 42
74
Кроме того, как указал пользователь3237465, если вы используете синтаксис префикса для операторов, то есть поместите его в круглые скобки, вы можете использовать его как любой другой символ:
(🙏) :: [a] -> Maybe a
(🙏) [] = Nothing
(🙏) ((👽):as) = Just (👽)
main = print $ (🙏) "♥"
Это почти пример в исходном посте. К сожалению, этот трюк не работает для переменной типа. документация написана немного, к сожалению, но фактически символы никогда не являются переменными типа и всегда строят конструкторы